📄 cips7.c
字号:
/***************************
*
* cips7.c
* COMPOSITE FILE COMPRISING:
* ed.c
* skeleton.c
* segment.c
* segment2.c
*
***************************\
/**********************************************
*
* file d:\cips\ed.c
*
* Functions: This file contains
* erosion
* dilation
* mask_erosion
* mask_dilation
* interior_outline
* exterior_outline
* copy_3_x_3
* opening
* closing
* get_shape_options
*
* Purpose:
* These functions perform the erosion,
* dilation, outlining, opening and
* closing operations.
*
* External Calls:
* wtiff.c - round_off_image_size
* create_file_if_needed
* write_array_into_tiff_image
* tiff.c - read_tiff_header
* rtiff.c - read_tiff_image
* numcvrt.c - get_integer
*
* Modifications:
* 14 March 1993 - created
*
************************************************/
#include "cips.h"
short edmask1[3][3] = {{0, 1, 0},
{0, 1, 0},
{0, 1, 0}};
short edmask2[3][3] = {{0, 0, 0},
{1, 1, 1},
{0, 0, 0}};
short edmask3[3][3] = {{0, 1, 0},
{1, 1, 1},
{0, 1, 0}};
short edmask4[3][3] = {{1, 1, 1},
{1, 1, 1},
{1, 1, 1}};
/*******************************************
*
* mask_dilation(...
*
* This function performs the dilation
* operation using the erosion-dilation
* 3x3 masks given above. It works on
* 0-value images.
*
*******************************************/
mask_dilation(in_name, out_name, the_image, out_image,
il, ie, ll, le, value, mask_type)
char in_name[], out_name[];
int il, ie, ll, le;
short the_image[ROWS][COLS],
out_image[ROWS][COLS],
mask_type, value;
{
int a, b, count, i, j, k;
short mask[3][3], max;
/**************************************
*
* Copy the 3x3 erosion-dilation mask
* specified by the mask_type.
*
***************************************/
switch(mask_type){
case 1:
copy_3_x_3(mask, edmask1);
break;
case 2:
copy_3_x_3(mask, edmask2);
break;
case 3:
copy_3_x_3(mask, edmask3);
break;
case 4:
copy_3_x_3(mask, edmask4);
break;
default:
printf("\nInvalid mask type, using mask 4");
copy_3_x_3(mask, edmask4);
break;
}
create_file_if_needed(in_name, out_name, out_image);
read_tiff_image(in_name, the_image, il, ie, ll, le);
/***************************
*
* Loop over image array
*
****************************/
printf("\n");
for(i=1; i<ROWS-1; i++){
if( (i%10) == 0) printf("%3d", i);
for(j=1; j<COLS-1; j++){
max = 0;
for(a=-1; a<=1; a++){
for(b=-1; b<=1; b++){
if(mask[a+1][b+1] == 1){
if(the_image[i+a][j+b] > max)
max = the_image[i+a][j+b];
} /* ends if mask == 1 */
} /* ends loop over b */
} /* ends loop over a */
out_image[i][j] = max;
} /* ends loop over j */
} /* ends loop over i */
fix_edges(out_image, 3);
write_array_into_tiff_image(out_name, out_image,
il, ie, ll, le);
} /* ends mask_dilation */
/*******************************************
*
* mask_erosion(...
*
* This function performs the erosion
* operation using the erosion-dilation
* 3x3 masks given above. It works on
* 0-value images.
*
*******************************************/
mask_erosion(in_name, out_name, the_image, out_image,
il, ie, ll, le, value, mask_type)
char in_name[], out_name[];
int il, ie, ll, le;
short the_image[ROWS][COLS],
out_image[ROWS][COLS],
mask_type, value;
{
int a, b, count, i, j, k;
short mask[3][3], min;
/**************************************
*
* Copy the 3x3 erosion-dilation mask
* specified by the mask_type.
*
***************************************/
switch(mask_type){
case 1:
copy_3_x_3(mask, edmask1);
break;
case 2:
copy_3_x_3(mask, edmask2);
break;
case 3:
copy_3_x_3(mask, edmask3);
break;
case 4:
copy_3_x_3(mask, edmask4);
break;
default:
printf("\nInvalid mask type, using mask 4");
copy_3_x_3(mask, edmask4);
break;
}
create_file_if_needed(in_name, out_name, out_image);
read_tiff_image(in_name, the_image, il, ie, ll, le);
/***************************
*
* Loop over image array
*
****************************/
printf("\n");
for(i=1; i<ROWS-1; i++){
if( (i%10) == 0) printf("%3d", i);
for(j=1; j<COLS-1; j++){
min = value;
for(a=-1; a<=1; a++){
for(b=-1; b<=1; b++){
if(mask[a+1][b+1] == 1){
if(the_image[i+a][j+b] < min)
min = the_image[i+a][j+b];
} /* ends if mask == 1 */
} /* ends loop over b */
} /* ends loop over a */
out_image[i][j] = min;
} /* ends loop over j */
} /* ends loop over i */
fix_edges(out_image, 3);
write_array_into_tiff_image(out_name, out_image,
il, ie, ll, le);
} /* ends mask_erosion */
/*******************************************
*
* erosion(...
*
* This function performs the erosion
* operation. If a value pixel has more
* than the threshold number of 0
* neighbors, you erode it by setting it
* to 0.
*
*******************************************/
erosion(in_name, out_name, the_image, out_image,
il, ie, ll, le, value, threshold)
char in_name[], out_name[];
int il, ie, ll, le;
short the_image[ROWS][COLS],
out_image[ROWS][COLS],
threshold, value;
{
int a, b, count, i, j, k;
create_file_if_needed(in_name, out_name, out_image);
read_tiff_image(in_name, the_image, il, ie, ll, le);
/***************************
*
* Loop over image array
*
****************************/
for(i=0; i<ROWS; i++)
for(j=0; j<COLS; j++)
out_image[i][j] = the_image[i][j];
printf("\n");
for(i=1; i<ROWS-1; i++){
if( (i%10) == 0) printf("%3d", i);
for(j=1; j<COLS-1; j++){
if(the_image[i][j] == value){
count = 0;
for(a=-1; a<=1; a++){
for(b=-1; b<=1; b++){
if(the_image[i+a][j+b] == 0)
count++;
} /* ends loop over b */
} /* ends loop over a */
if(count > threshold) out_image[i][j] = 0;
} /* ends if the_image == value */
} /* ends loop over j */
} /* ends loop over i */
fix_edges(out_image, 3);
write_array_into_tiff_image(out_name, out_image,
il, ie, ll, le);
} /* ends erosion */
/*******************************************
*
* dilation(...
*
* This function performs the dilation
* operation. If a 0 pixel has more than
* threshold number of value neighbors,
* you dilate it by setting it to value.
*
*******************************************/
dilation(in_name, out_name, the_image, out_image,
il, ie, ll, le, value, threshold)
char in_name[], out_name[];
int il, ie, ll, le;
short the_image[ROWS][COLS],
out_image[ROWS][COLS],
threshold, value;
{
int a, b, count, i, j, k;
create_file_if_needed(in_name, out_name, out_image);
read_tiff_image(in_name, the_image, il, ie, ll, le);
/***************************
*
* Loop over image array
*
****************************/
printf("\n");
for(i=1; i<ROWS-1; i++){
if( (i%10) == 0) printf("%3d", i);
for(j=1; j<COLS-1; j++){
out_image[i][j] = the_image[i][j];
if(the_image[i][j] == 0){
count = 0;
for(a=-1; a<=1; a++){
for(b=-1; b<=1; b++){
if(a!=0 && b!=0){
if(the_image[i+a][j+b] == value)
count++;
} /* ends avoid the center pixel */
} /* ends loop over b */
} /* ends loop over a */
if(count > threshold)
out_image[i][j] = value;
} /* ends if the_image == 0 */
} /* ends loop over j */
} /* ends loop over i */
fix_edges(out_image, 3);
write_array_into_tiff_image(out_name, out_image,
il, ie, ll, le);
} /* ends dilation */
/*******************************************
*
* interior_outline(...
*
* This function produces the outline of
* any "holes" inside an object. The
* method is:
* output = erosion of input
* final output = input - output
*
*******************************************/
interior_outline(in_name, out_name, the_image,
out_image, il, ie, ll, le, value,
mask_type)
char in_name[], out_name[];
int il, ie, ll, le;
short the_image[ROWS][COLS],
out_image[ROWS][COLS],
mask_type, value;
{
int a, b, count, i, j, k;
short mask[3][3], max;
/**************************************
*
* Copy the 3x3 erosion-dilation mask
* specified by the mask_type.
*
***************************************/
switch(mask_type){
case 1:
copy_3_x_3(mask, edmask1);
break;
case 2:
copy_3_x_3(mask, edmask2);
break;
case 3:
copy_3_x_3(mask, edmask3);
break;
case 4:
copy_3_x_3(mask, edmask4);
break;
default:
printf("\nInvalid mask type, using mask 4");
copy_3_x_3(mask, edmask4);
break;
}
create_file_if_needed(in_name, out_name, out_image);
read_tiff_image(in_name, the_image, il, ie, ll, le);
mask_erosion(in_name, out_name, the_image,
out_image, il, ie, ll, le,
value, mask_type);
for(i=0; i<ROWS; i++)
for(j=0; j<COLS; j++)
the_image[i][j] =
the_image[i][j] - out_image[i][j];
write_array_into_tiff_image(out_name, the_image,
il, ie, ll, le);
} /* ends interior_outline */
/*******************************************
*
* exterior_outline(...
*
* This function produces the outline of
* exterior of an object. The
* method is:
* output = dilation of input
* final output = output - input
*
*******************************************/
exterior_outline(in_name, out_name, the_image, out_image,
il, ie, ll, le, value, mask_type)
char in_name[], out_name[];
int il, ie, ll, le;
short the_image[ROWS][COLS],
out_image[ROWS][COLS],
mask_type, value;
{
int a, b, count, i, j, k;
short mask[3][3], max;
/**************************************
*
* Copy the 3x3 erosion-dilation mask
* specified by the mask_type.
*
***************************************/
switch(mask_type){
case 1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -