📄 cips7.c
字号:
for(a=-1; a<2; a++)
for(b=-1; b<2; b++)
temp[a+1][b+1] = the_image[i+a][b+j];
/**************************************
*
* Grow objects inside the temp array.
*
***************************************/
for(a=0; a<3; a++){
for(b=0; b<3; b++){
stack_empty = 1;
stack_pointer = -1;
if(temp[a][b] == value){
little_label_and_check(temp, stack, label,
&stack_empty,
&stack_pointer,
a, b, value);
found = 1;
} /* ends if temp == value */
while(stack_empty == 0){
pop_a = stack[stack_pointer][0]; /* POP */
pop_b = stack[stack_pointer][1]; /* POP */
--stack_pointer;
if(stack_pointer <= 0){
stack_pointer = 0;
stack_empty = 1;
} /* ends if stack_pointer */
little_label_and_check(temp, stack, label,
&stack_empty,
&stack_pointer,
pop_a, pop_b, value);
} /* ends while stack_empty == 0 */
if(found){
found = 0;
label++;
} /* ends if object_found */
} /* ends loop over b */
} /* ends loop over a */
/**************************************
*
* Look at the center pixel. If it
* has two non-zero neigbors whose
* pixels are not the same, then
* you cannot dilate.
*
***************************************/
first_value = -1;
for(a=0; a<3; a++){
for(b=0; b<3; b++){
if(temp[a][b] != 0 &&
first_value == -1){
first_value = temp[a][b];
}
if(temp[a][b] != 0 &&
first_value != -1){
if(temp[a][b] != first_value){
return(zero);
}
}
} /* ends loop over b */
} /* ends loop over a */
return(one);
} /* ends can_dilate */
/*******************************************
*
* little_label_and_check(...
*
* This function labels the objects in
* in a 3x3 area.
*
*******************************************/
little_label_and_check(temp, stack, label, stack_empty,
stack_pointer, a, b, value)
int a, b, stack[12][2],
*stack_empty, *stack_pointer;
short temp[3][3], label, value;
{
int c, d;
temp[a][b] = label;
for(c=a-1; c<=a+1; c++){
for(d=b-1; d<=b+1; d++){
if(c >= 0 &&
c <= 2 &&
d >= 0 &&
d <= 2)
if(temp[c][d] == value){ /* PUSH */
*stack_pointer = *stack_pointer + 1;
stack[*stack_pointer][0] = c;
stack[*stack_pointer][1] = d;
*stack_empty = 0;
} /* ends if temp == value */
} /* ends loop over d */
} /* ends loop over c */
} /* ends little_label_and_check */
/*******************************************
*
* special_closing(...
*
* Closing is dilation followed by erosion.
* This routine will use the dilate_not_join
* dilation routine. This will not allow
* two separate objects to join.
*
* The number parameter specifies how
* dilations to perform before doing one
* erosion.
*
*******************************************/
special_closing(in_name, out_name, the_image,
out_image, il, ie, ll, le,
value, threshold, number)
char in_name[], out_name[];
int il, ie, ll, le, number;
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);
dilate_not_join(in_name, out_name, the_image,
out_image, il, ie, ll, le,
value, threshold);
if(number > 1){
count = 1;
while(count < number){
count++;
dilate_not_join(out_name, out_name, the_image,
out_image, il, ie, ll, le,
value, threshold);
} /* ends while */
} /* ends if number > 1 */
erosion(out_name, out_name, the_image,
out_image, il, ie, ll, le,
value, threshold);
write_array_into_tiff_image(out_name, out_image,
il, ie, ll, le);
} /* ends special_closing */
/*******************************************
*
* special_opening(...
*
* Opening is erosion followed by dilation.
* This routine will use the thinning
* erosion routine. This will not allow
* an object to erode to nothing.
*
* The number parameter specifies how
* erosions to perform before doing one
* dilation.
*
*******************************************/
special_opening(in_name, out_name, the_image,
out_image, il, ie, ll, le,
value, threshold, number)
char in_name[], out_name[];
int il, ie, ll, le, number;
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);
thinning(in_name, out_name, the_image,
out_image, il, ie, ll, le,
value, threshold, 1);
if(number > 1){
count = 1;
while(count < number){
count++;
thinning(out_name, out_name, the_image,
out_image, il, ie, ll, le,
value, threshold, 1);
} /* ends while */
} /* ends if number > 1 */
dilation(out_name, out_name, the_image,
out_image, il, ie, ll, le,
value, threshold);
write_array_into_tiff_image(out_name, out_image,
il, ie, ll, le);
} /* ends special_opening */
/*******************************************
*
* edm(..
*
* This function calculates the Euclidean
* distance measure for objects in an image.
* It calculates the distance from any
* pixel=value to the nearest zero pixel
*
*******************************************/
edm(in_name, out_name, the_image, out_image,
il, ie, ll, le, value)
char in_name[], out_name[];
int il, ie, ll, le;
short the_image[ROWS][COLS],
out_image[ROWS][COLS],
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);
for(i=0; i<ROWS; i++)
for(j=0; j<COLS; j++)
out_image[i][j] = 0;
/***************************
*
* Loop over image array
*
****************************/
printf("\n");
for(i=0; i<ROWS; i++){
if( (i%10) == 0) printf("%3d", i);
for(j=0; j<COLS; j++){
if(the_image[i][j] == value)
out_image[i][j] = distance_8(the_image,
i, j, value);
} /* ends loop over j */
} /* ends loop over i */
write_array_into_tiff_image(out_name, out_image,
il, ie, ll, le);
} /* ends edm */
/*******************************************
*
* distance_8(..
*
* This function finds the distance from
* a pixel to the nearest zero pixel.
* It search in all eight directions.
*
*******************************************/
distance_8(the_image, a, b, value)
int a, b;
short the_image[ROWS][COLS], value;
{
int i, j, measuring;
short dist1 = 0,
dist2 = 0,
dist3 = 0,
dist4 = 0,
dist5 = 0,
dist6 = 0,
dist7 = 0,
dist8 = 0,
result = 0;
/* straight up */
measuring = 1;
i = a;
j = b;
while(measuring){
i--;
if(i >= 0){
if(the_image[i][j] == value)
dist1++;
else
measuring = 0;
}
else
measuring = 0;
} /* ends while measuring */
result = dist1;
/* straight down */
measuring = 1;
i = a;
j = b;
while(measuring){
i++;
if(i <= ROWS-1){
if(the_image[i][j] == value)
dist2++;
else
measuring = 0;
}
else
measuring = 0;
} /* ends while measuring */
if(dist2 <= result)
result = dist2;
/* straight left */
measuring = 1;
i = a;
j = b;
while(measuring){
j--;
if(j >= 0){
if(the_image[i][j] == value)
dist3++;
else
measuring = 0;
}
else
measuring = 0;
} /* ends while measuring */
if(dist3 <= result)
result = dist3;
/* straight right */
measuring = 1;
i = a;
j = b;
while(measuring){
j++;
if(j <= COLS-1){
if(the_image[i][j] == value)
dist4++;
else
measuring = 0;
}
else
measuring = 0;
} /* ends while measuring */
if(dist4 <= result)
result = dist4;
/* left and up */
measuring = 1;
i = a;
j = b;
while(measuring){
j--;
i--;
if(j >= 0 && i>=0){
if(the_image[i][j] == value)
dist5++;
else
measuring = 0;
}
else
measuring = 0;
} /* ends while measuring */
dist5 = (dist5*14)/10;
if(dist5 <= result)
result = dist5;
/* right and up */
measuring = 1;
i = a;
j = b;
while(measuring){
j++;
i--;
if(j <=COLS-1 && i>=0){
if(the_image[i][j] == value)
dist6++;
else
measuring = 0;
}
else
measuring = 0;
} /* ends while measuring */
dist6 = (dist6*14)/10;
if(dist6 <= result)
result = dist6;
/* right and down */
measuring = 1;
i = a;
j = b;
while(measuring){
j++;
i++;
if(j <=COLS-1 && i<=ROWS-1){
if(the_image[i][j] == value)
dist7++;
else
measuring = 0;
}
else
measuring = 0;
} /* ends while measuring */
dist7 = (dist7*14)/10;
if(dist7 <= result)
result = dist7;
/* left and down */
measuring = 1;
i = a;
j = b;
while(measuring){
j--;
i++;
if(j >=0 && i<=ROWS-1){
if(the_image[i][j] == value)
dist8++;
else
measuring = 0;
}
else
measuring = 0;
} /* ends while measuring */
dist8 = (dist8*14)/10;
if(dist8 <= result)
result = dist8;
return(result);
} /* ends distance_8 */
/*******************************************
*
* mat(..
*
* This function finds the medial axis
* transform for objects in an image.
* The mat are those points that are
* minimally distant to more than one
* boundary point.
*
*******************************************/
mat(in_name, out_name, the_image, out_image,
il, ie, ll, le, value)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -