📄 segment2.c
字号:
/***********************************************
*
* file segment2.c
*
* Functions: This file contains
* find_cutoff_point
* edge_region
* gray_shade_region
* edge_gray_shade_region
* pixel_grow
* pixel_label_and_check_neighbors
* is_close
* erode_image_array
* get_edge_region_options
*
* Purpose:
* These function implement the three
* segmentation techniques in Image
* Processing part 10.
*
* External Calls:
* edges.c - quick_edge
* homogeneity
* difference_edge
* contrast_edge
* gaussian_edge
* range
* variance
* detect_edges
* hist.c - calculate_histogram
* zero_histogram
* thresh.c - threshold_image_array
*
* Modifications:
* 5 December 1992 - created
* 15 August 1998 - modified to work on entire
* images at once.
*
*************************************************/
#include "cips.h"
struct stacksp{
short x;
short y;
struct stacksp *next;
};
struct stacksp *stackp;
/*******************************************
*
* find_cutoff_point(..
*
* This function looks at a histogram
* and sets a cuttoff point at a given
* percentage of pixels.
* For example, if percent=0.6, you
* start at 0 in the histogram and count
* up until you've hit 60% of the pixels.
* Then you stop and return that pixel
* value.
*
********************************************/
find_cutoff_point(histogram, percent,
cutoff, rows, cols)
unsigned long histogram[];
float percent;
long cols, rows;
short *cutoff;
{
float fd, fsum, sum_div;
int i, looking;
long lc, lr, num=0, sum=0;
sum = 0;
i = 0;
lr = (long)(rows);
lc = (long)(cols);
num = lr*lc;
fd = (float)(num);
while(looking){
fsum = (float)(sum);
sum_div = fsum/fd;
if(sum_div >= percent)
looking = 0;
else
sum = sum + histogram[i++];
} /* ends while looking */
if(i >= (GRAY_LEVELS+1)) i = GRAY_LEVELS;
*cutoff = i;
printf("\nCutoff is %d sum=%ld", *cutoff, sum);
} /* ends find_cutoff_point */
/*******************************************
*
* erode_image_array(..
*
* This function erodes pixels. If a pixel
* equals value and has more than threshold
* neighbors equal to 0, then set that
* pixel in the output to 0.
*
*******************************************/
erode_image_array(the_image, out_image,
value, threshold,
rows, cols)
short **the_image,
**out_image,
threshold,
value;
long cols, rows;
{
int a, b, count, i, j, k,
length, width;
/***************************
*
* 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 */
} /* ends erode_image_array */
/**********************************************
*
* pixel_grow(...
*
* The function grows regions. It is similar
* to the grow function in segment.c, but it
* has several new capabilities. It can
* eliminate regions if they are too large or
* too small.
*
* It ignores pixels = FORGET_IT. This allows
* it to ignore edges or regions already
* eliminated from consideration.
*
* It adds pixels to a growing region only if
* the pixel is close enough to the average gray
* level of that region.
*
***********************************************/
pixel_grow(input, output, diff,
min_area, max_area,
rows, cols)
long cols, rows;
short **input,
**output,
max_area,
min_area,
diff;
{
char name[80];
int count,
first_call,
i,
ii,
j,
jj,
object_found;
short g_label, target, pop_i, pop_j, sum;
for(i=0; i<rows; i++)
for(j=0; j<cols; j++)
output[i][j] = 0;
g_label = 2;
object_found = 0;
first_call = 1;
/*************************************
*
* Now begin the process of growing
* regions.
*
**************************************/
for(i=0; i<rows; i++){
if( (i%4) == 0) printf("\n");
printf("-i=%3d label=%3d", i, g_label);
for(j=0; j<cols; j++){
target = input[i][j];
sum = target;
count = 0;
/********************************
stack_file_in_use = 0;
stack_empty = 1;
pointer = -1;
*******************************/
stackp = NULL;
/**********************************
*
* Search for the first pixel of
* a region. It must not equal
* FORGET_IT, and it must be close
* enough to the target (ave value).
*
***********************************/
if(input[i][j] != FORGET_IT &&
is_close(input[i][j], target, diff) &&
output[i][j] == 0){
pixel_label_and_check_neighbor(input,
output, &target, &sum,
&count, g_label,
i, j, diff,
&first_call,
rows, cols);
object_found = 1;
} /* ends if is_close */
/*****************************
*
* If the stack is not empty,
* pop the coordinates of
* the pixel off the stack
* and check its 8 neighbors.
*
*******************************/
while(is_not_emptyp(stackp)){
popp(&pop_i, &pop_j);
pixel_label_and_check_neighbor(input,
output, &target, &sum,
&count, g_label,
pop_i, pop_j,
diff,
&first_call,
rows, cols);
} /* ends while stack_empty == 0 */
if(object_found == 1){
object_found = 0;
/**********************************
*
* The object must be in the
* size constraints given by
* min_area and max_area
*
*********************************/
if(count >= min_area &&
count <= max_area)
++g_label;
/**********************************
*
* Remove the object from the
* output. Set all pixels in the
* object you are removing to
* FORGET_IT.
*
**********************************/
else{
for(ii=0; ii<rows; ii++){
for(jj=0; jj<cols; jj++){
if(output[ii][jj] == g_label){
output[ii][jj] = 0;
input[ii][jj] = FORGET_IT;
} /* ends if output == g_label */
} /* ends loop over jj */
} /* ends loop over ii */
} /* ends else remove object */
} /* ends if object_found == 1 */
} /* ends loop over j */
} /* ends loop over i */
printf("\nGROW> found %d objects", g_label);
} /* ends pixel_grow */
/********************************************
*
* pixel_label_and_check_neighbors(...
*
* This function labels a pixel with an object
* label and then checks the pixel's 8
* neighbors. If any of the neigbors are
* set, then they are also labeled.
*
* It also updates the target or ave pixel
* value of the pixels in the region being
* grown.
*
***********************************************/
pixel_label_and_check_neighbor(input_image,
output_image, target,
sum, count,
g_label,
r, e, diff,
first_call,
rows, cols)
int *count,
e,
*first_call,
r;
long cols, rows;
short **input_image,
**output_image,
g_label,
*sum,
*target,
diff;
{
char response[80];
int already_labeled = 0,
i, j;
/**printf("\nDEBUG>placn> start rx=%d ey=%d",r,e);**/
if (output_image[r][e] != 0)
already_labeled = 1;
output_image[r][e] = g_label;
*count = *count + 1;
if(*count > 1){
*sum = *sum + input_image[r][e];
*target = *sum / *count;
}
/***************************************
*
* Look at the 8 neighors of the
* point r,e.
*
* Ensure the points are close enough
* to the target and do not equal
* FORGET_IT.
*
* Ensure the points you are checking
* are in the image, i.e. not less
* than zero and not greater than
* rows-1 or cols-1.
*
***************************************/
for(i=(r-1); i<=(r+1); i++){
for(j=(e-1); j<=(e+1); j++){
if((i>=0) && /* ensure point in in image */
(i<=rows-1) &&
(j>=0) &&
(j<=cols-1)){
if( input_image[i][j] != FORGET_IT &&
is_close(input_image[i][j],
*target, diff) &&
output_image[i][j] == 0){
pushp(i, j);
} /* ends if is_close */
} /* end if i and j are on the image */
} /* ends loop over i rows */
} /* ends loop over j columns */
} /* ends pixel_label_and_check_neighbors */
/********************************************
*
* is_close(...
*
* This function tests to see if two pixel
* values are close enough together. It
* uses the delta parameter to make this
* judgement.
*
***********************************************/
is_close(a, b, delta)
short a, b, delta;
{
int result = 0;
short diff;
diff = a-b;
if(diff < 0) diff = diff*(-1);
if(diff < delta)
result = 1;
return(result);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -