📄 cips7.c
字号:
*
* Scan top to bottom
* Look for 0-value transition
*
****************************/
printf("\n");
for(j=1; j<COLS-1; j++){
if( (j%10) == 0) printf("%3d", j);
for(i=1; i<ROWS-1; i++){
if(the_image[i-1][j] == 0 &&
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){
if(can_thin(the_image, i, j, value)){
out_image[i][j] = 0;
big_count++;
} /* ends if can_thin */
} /* ends if count > threshold */
} /* ends if the_image == value */
} /* ends loop over i */
} /* ends loop over j */
/**************************************
*
* Copy the output back to the input.
*
**************************************/
for(i=0; i<ROWS; i++)
for(j=0; j<COLS; j++)
the_image[i][j] = out_image[i][j];
/***************************
*
* Scan bottom to top
* Do this by scanning top
* to bottom and look for
* value-0 transition.
*
****************************/
printf("\n");
for(j=1; j<COLS-1; j++){
if( (j%10) == 0) printf("%3d", j);
for(i=1; i<ROWS-1; i++){
if(the_image[i+1][j] == 0 &&
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){
if(can_thin(the_image, i, j, value)){
out_image[i][j] = 0;
big_count++;
} /* ends if can_thin */
} /* ends if count > threshold */
} /* ends if the_image == value */
} /* ends loop over i */
} /* ends loop over j */
/**************************************
*
* Copy the output back to the input.
*
**************************************/
for(i=0; i<ROWS; i++)
for(j=0; j<COLS; j++)
the_image[i][j] = out_image[i][j];
/**************************************
*
* Now look at the result of this big
* pass through the image.
*
***************************************/
printf("\n\nThinned %d pixels", big_count);
if(big_count == 0)
not_finished = 0;
else{
for(i=0; i<ROWS; i++)
for(j=0; j<COLS; j++)
the_image[i][j] = out_image[i][j];
} /* ends else */
} /* ends while not_finished */
fix_edges(out_image, 3);
write_array_into_tiff_image(out_name, out_image,
il, ie, ll, le);
} /* ends thinning */
/*******************************************
*
* can_thin(...
*
* Look at the neighbors of the center pixel.
* If a neighbor == value, then it must
* have a neighbor == value other than the
* center pixel.
*
* Procedure:
* . Copy the 3x3 area surrounding pixel
* i,j to a temp array.
* . Set the center pixel to zero.
* . Look at each non-zero pixel in temp.
* . If you cannot find a non-zero
* neighbor.
* . Then you cannot thin.
*
*******************************************/
can_thin(the_image, i, j, value)
int i, j;
short the_image[ROWS][COLS], value;
{
int a, b, c, d, count,
no_neighbor, one=1, zero=0;
short temp[3][3];
/**************************************
*
* Copy the center pixel and its
* neighbors to the temp array.
*
***************************************/
for(a=-1; a<2; a++)
for(b=-1; b<2; b++)
temp[a+1][b+1] = the_image[i+a][b+j];
/**************************************
*
* Set the center of temp to 0.
*
***************************************/
temp[1][1] = 0;
/**************************************
*
* Check the non-zero pixels in temp.
*
***************************************/
for(a=0; a<3; a++){
for(b=0; b<3; b++){
if(temp[a][b] == value){
temp[a][b] = 0;
/**************************************
*
* Check the neighbors of this pixel
* If there is a single non-zero
* neighbor, set no_neighbor = 0.
*
***************************************/
no_neighbor = 1;
for(c=-1; c<2; c++){
for(d=-1; d<2; d++){
if( ((a+c) >= 0) &&
((a+c) <= 2) &&
((b+d) >= 0) &&
((b+d) <= 2)){
if(temp[a+c][b+d] == value){
no_neighbor = 0;
} /* ends if temp == value */
} /* ends if part of temp array */
} /* ends loop over d */
} /* ends loop over c */
temp[a][b] = value;
/**************************************
*
* If the non-zero pixel did not
* have any non-zero neighbors,
* no_neighbor still equals 1,
* and we cannot thin, so return
* zero.
*
***************************************/
if(no_neighbor){
return(zero);
}
} /* ends if temp[a][b] == value */
} /* ends loop over b */
} /* ends loop over a */
/**************************************
*
* First, ensure the object is more
* than two wide. If it is two wide,
* you will thin out the entire object.
* Check in all eight directions.
* If the distance to a zero is 0 or
* >= 2, then ok you can thin so go
* on to the remainder of this routine.
* If not, you cannot thin so return
* zero.
*
***************************************/
return(one);
} /* ends can_thin */
/*******************************************
*
* dilate_not_join(...
*
* Use a variation of the grass fire
* wave front approach.
*
* Raster scan the image left to right
* and examine and dilate the left edge pixels
* (a value to 0 transition). Process them
* normally and "save" the result. Next,
* raster scan the image right to left and
* save. Raster scan top to bottom and save.
* Raster scan bottom to top and save.
*
* That is one complete pass.
*
*******************************************/
dilate_not_join(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);
for(i=0; i<ROWS; i++)
for(j=0; j<COLS; j++)
out_image[i][j] = the_image[i][j];
/***************************
*
* Scan left to right
* Look for value-0 transition
*
****************************/
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-1] == value &&
the_image[i][j] == 0){
count = 0;
for(a=-1; a<=1; a++){
for(b=-1; b<=1; b++){
if(the_image[i+a][j+b]==value)
count++;
} /* ends loop over b */
} /* ends loop over a */
if(count > threshold){
if(can_dilate(the_image,i,j,value)){
out_image[i][j] = value;
} /* ends if can_dilate */
} /* ends if count > threshold */
} /* ends if the_image == value */
} /* ends loop over j */
} /* ends loop over i */
/**************************************
*
* Copy the output back to the input.
*
**************************************/
for(i=0; i<ROWS; i++)
for(j=0; j<COLS; j++)
the_image[i][j] = out_image[i][j];
/***************************
*
* Scan right to left
* Do this by scanning left
* to right and look for
* 0-value transition.
*
****************************/
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+1] == value &&
the_image[i][j] == 0){
count = 0;
for(a=-1; a<=1; a++){
for(b=-1; b<=1; b++){
if(the_image[i+a][j+b]==value)
count++;
} /* ends loop over b */
} /* ends loop over a */
if(count > threshold){
if(can_dilate(the_image,i,j,value)){
out_image[i][j] = value;
} /* ends if can_dilate */
} /* ends if count > threshold */
} /* ends if the_image == value */
} /* ends loop over j */
} /* ends loop over i */
/**************************************
*
* Copy the output back to the input.
*
**************************************/
for(i=0; i<ROWS; i++)
for(j=0; j<COLS; j++)
the_image[i][j] = out_image[i][j];
/***************************
*
* Scan top to bottom
* Look for value-0 transition
*
****************************/
printf("\n");
for(j=1; j<COLS-1; j++){
if( (j%10) == 0) printf("%3d", j);
for(i=1; i<ROWS-1; i++){
if(the_image[i-1][j] == value &&
the_image[i][j] == 0){
count = 0;
for(a=-1; a<=1; a++){
for(b=-1; b<=1; b++){
if(the_image[i+a][j+b]==value)
count++;
} /* ends loop over b */
} /* ends loop over a */
if(count > threshold){
if(can_dilate(the_image,i,j,value)){
out_image[i][j] = value;
} /* ends if can_dilate */
} /* ends if count > threshold */
} /* ends if the_image == value */
} /* ends loop over i */
} /* ends loop over j */
/**************************************
*
* Copy the output back to the input.
*
**************************************/
for(i=0; i<ROWS; i++)
for(j=0; j<COLS; j++)
the_image[i][j] = out_image[i][j];
/***************************
*
* Scan bottom to top
* Do this by scanning top
* to bottom and look for
* 0-value transition.
*
****************************/
printf("\n");
for(j=1; j<COLS-1; j++){
if( (j%10) == 0) printf("%3d", j);
for(i=1; i<ROWS-1; i++){
if(the_image[i+1][j] == value &&
the_image[i][j] == 0){
count = 0;
for(a=-1; a<=1; a++){
for(b=-1; b<=1; b++){
if(the_image[i+a][j+b]==value)
count++;
} /* ends loop over b */
} /* ends loop over a */
if(count > threshold){
if(can_dilate(the_image,i,j,value)){
out_image[i][j] = value;
} /* ends if can_dilate */
} /* ends if count > threshold */
} /* ends if the_image == value */
} /* ends loop over i */
} /* ends loop over j */
/**************************************
*
* Copy the output back to the input.
*
**************************************/
for(i=0; i<ROWS; i++)
for(j=0; j<COLS; j++)
the_image[i][j] = out_image[i][j];
fix_edges(out_image, 3);
write_array_into_tiff_image(out_name, out_image,
il, ie, ll, le);
} /* ends dilate_not_join */
/*******************************************
*
* can_dilate(...
*
* This function decides if you can dilate
* (set to value) a pixel without joining
* two separate objects in a 3x3 area.
*
* First, you grow regions inside the 3x3
* area. Next, check if the center pixel
* has neighbors with differing values.
* If it does, you cannot dilate it because
* that would join two separate objects.
*
*******************************************/
can_dilate(the_image, i, j, value)
int i, j;
short the_image[ROWS][COLS], value;
{
int a, b, c, d, count, found=0,
no_neighbor,
stack_pointer=-1,
stack_empty=1,
stack[12][2],
pop_a, pop_b,
one=1,
zero=0;
short first_value, label = 2, temp[3][3];
/**************************************
*
* Copy the center pixel and its
* neighbors to the temp array.
*
***************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -