📄 segments.c
字号:
if(distance[i] > PEAK_SPACE) *peak2 = peaks[i][1];
} /* ends find_peaks */
/********************************************
*
* insert_into_peaks(...
*
* This function takes a value and its
* place in the histogram and inserts them
* into a peaks array. This helps us rank
* the the peaks in the histogram.
*
* The objective is to build a list of
* histogram peaks and thier locations.
*
* The peaks array holds the peak value
* in the first place and its location in
* the second place.
*
*********************************************/
insert_into_peaks(peaks, max, max_place)
int max, max_place, peaks[PEAKS][2];
{
int i, j;
/* first case */
if(max > peaks[0][0]){
for(i=PEAKS-1; i>0; i--){
peaks[i][0] = peaks[i-1][0];
peaks[i][1] = peaks[i-1][1];
}
peaks[0][0] = max;
peaks[0][1] = max_place;
} /* ends if */
/* middle cases */
for(j=0; j<PEAKS-3; j++){
if(max < peaks[j][0] && max > peaks[j+1][0]){
for(i=PEAKS-1; i>j+1; i--){
peaks[i][0] = peaks[i-1][0];
peaks[i][1] = peaks[i-1][1];
}
peaks[j+1][0] = max;
peaks[j+1][1] = max_place;
} /* ends if */
} /* ends loop over j */
/* last case */
if(max < peaks[PEAKS-2][0] &&
max > peaks[PEAKS-1][0]){
peaks[PEAKS-1][0] = max;
peaks[PEAKS-1][1] = max_place;
} /* ends if */
} /* ends insert_into_peaks */
/********************************************
*
* peaks_high_low(...
*
* This function uses the histogram array
* and the peaks to find the best high and
* low threshold values for the threshold
* function. You want the hi and low values
* so that you will threshold the image around
* the smaller of the two "humps" in the
* histogram. This is because the smaller
* hump represents the objects while the
* larger hump represents the background.
*
*********************************************/
peaks_high_low(histogram, peak1, peak2, hi, low)
int peak1, peak2;
short *hi, *low;
unsigned long histogram[];
{
int i, mid_point;
unsigned long sum1 = 0, sum2 = 0;
if(peak1 > peak2)
mid_point = ((peak1 - peak2)/2) + peak2;
if(peak1 < peak2)
mid_point = ((peak2 - peak1)/2) + peak1;
for(i=0; i<mid_point; i++)
sum1 = sum1 + histogram[i];
for(i=mid_point; i<=GRAY_LEVELS; i++)
sum2 = sum2 + histogram[i];
if(sum1 >= sum2){
*low = mid_point;
*hi = GRAY_LEVELS;
}
else{
*low = 0;
*hi = mid_point;
}
} /* ends peaks_high_low */
/********************************************
*
* valley_high_low(...
*
* This function uses the histogram array
* and the valleys to find the best high and
* low threshold values for the threshold
* function. You want the hi and low values
* so that you will threshold the image around
* the smaller of the two "humps" in the
* histogram. This is because the smaller
* hump represents the objects while the
* larger hump represents the background.
*
*********************************************/
valley_high_low(histogram, peak1, peak2, hi, low)
int peak1, peak2;
short *hi, *low;
unsigned long histogram[];
{
int i, valley_point;
unsigned long sum1 = 0, sum2 = 0;
find_valley_point(histogram, peak1, peak2,
&valley_point);
/*printf("\nVHL> valley point is %d",
valley_point);*/
for(i=0; i<valley_point; i++)
sum1 = sum1 + histogram[i];
for(i=valley_point; i<=GRAY_LEVELS; i++)
sum2 = sum2 + histogram[i];
if(sum1 >= sum2){
*low = valley_point;
*hi = GRAY_LEVELS;
}
else{
*low = 0;
*hi = valley_point;
}
} /* ends valley_high_low */
/********************************************
*
* find_valley_point(...
*
* This function finds the low point of
* the valley between two peaks in a
* histogram. It starts at the lowest
* peak and works its way up to the
* highest peak. Along the way, it looks
* at each point in the histogram and inserts
* them into a list of points. When done,
* it has the location of the smallest histogram
* point - that is the valley point.
*
* The deltas array holds the delta value
* in the first place and its location in
* the second place.
*
*********************************************/
find_valley_point(histogram, peak1,
peak2, valley_point)
int peak1, peak2, *valley_point;
unsigned long histogram[];
{
int deltas[PEAKS][2], delta_hist, i;
for(i=0; i<PEAKS; i++){
deltas[i][0] = 10000;
deltas[i][1] = -1;
}
if(peak1 < peak2){
for(i=peak1+1; i<peak2; i++){
delta_hist = (int)(histogram[i]);
insert_into_deltas(deltas, delta_hist, i);
} /* ends loop over i */
} /* ends if peak1 < peak2 */
if(peak2 < peak1){
for(i=peak2+1; i<peak1; i++){
delta_hist = (int)(histogram[i]);
insert_into_deltas(deltas, delta_hist, i);
} /* ends loop over i */
} /* ends if peak2 < peak1 */
*valley_point = deltas[0][1];
} /* ends find_valley_point */
/********************************************
*
* insert_into_deltas(...
*
* This function inserts histogram deltas
* into a deltas array. The smallest delta
* will be at the top of the array.
*
* The objective is to build a list of
* histogram area deltas and thier locations.
*
* The deltas array holds the delta value
* in the first place and its location in
* the second place.
*
*********************************************/
insert_into_deltas(deltas, value, place)
int value, place, deltas[PEAKS][2];
{
int i, j;
/* first case */
if(value < deltas[0][0]){
for(i=PEAKS-1; i>0; i--){
deltas[i][0] = deltas[i-1][0];
deltas[i][1] = deltas[i-1][1];
}
deltas[0][0] = value;
deltas[0][1] = place;
} /* ends if */
/* middle cases */
for(j=0; j<PEAKS-3; j++){
if(value > deltas[j][0] &&
value < deltas[j+1][0]){
for(i=PEAKS-1; i>j+1; i--){
deltas[i][0] = deltas[i-1][0];
deltas[i][1] = deltas[i-1][1];
}
deltas[j+1][0] = value;
deltas[j+1][1] = place;
} /* ends if */
} /* ends loop over j */
/* last case */
if(value > deltas[PEAKS-2][0] &&
value < deltas[PEAKS-1][0]){
deltas[PEAKS-1][0] = value;
deltas[PEAKS-1][1] = place;
} /* ends if */
} /* ends insert_into_deltas */
/********************************************
*
* get_segmentation_options(...
*
* This function interacts with the user
* to obtain the options for image
* segmentation.
*
*********************************************/
get_segmentation_options(method, hi, low, value)
char method[];
short *hi, *low, *value;
{
int i, not_finished = 1, response;
while(not_finished){
printf(
"\n\nThe image segmentation options are:\n");
printf("\n\t1. Method is %s", method);
printf("\n\t (options are manual peaks");
printf( " valleys adapative)");
printf("\n\t2. Value is %d", *value);
printf("\n\t3. Hi is %d", *hi);
printf("\n\t4. Low is %d", *low);
printf("\n\t Hi and Low needed only for");
printf( " manual method");
printf("\n\nEnter choice (0 = no change):_\b");
get_integer(&response);
if(response == 0)
not_finished = 0;
if(response == 1){
printf("\nEnter method (options are:");
printf(" manual peaks valleys adaptive)\n\t");
gets(method);
}
if(response == 2){
printf("\nEnter value: ___\b\b\b");
get_short(value);
}
if(response == 3){
printf("\nEnter hi: ___\b\b\b");
get_short(hi);
}
if(response == 4){
printf("\nEnter low: ___\b\b\b");
get_short(low);
}
} /* ends while not_finished */
} /* ends get_segmentation_options */
/********************************************
*
* get_threshold_options(...
*
* This function interacts with the user
* to obtain the options for image
* threshold.
*
*********************************************/
get_threshold_options(method, hi, low, value)
char method[];
short *hi, *low, *value;
{
int i, not_finished = 1, response;
while(not_finished){
printf("\n\nThe image threshold options are:\n");
printf("\n\t1. Method is %s", method);
printf("\n\t (options are manual peaks");
printf( " valleys adapative)");
printf("\n\t2. Value is %d", *value);
printf("\n\t3. Hi is %d", *hi);
printf("\n\t4. Low is %d", *low);
printf("\n\t Hi and Low needed only for");
printf( " manual method");
printf("\n\nEnter choice (0 = no change):_\b");
get_integer(&response);
if(response == 0)
not_finished = 0;
if(response == 1){
printf("\nEnter method (options are:");
printf(" manual peaks valleys adaptive)\n\t");
gets(method);
}
if(response == 2){
printf("\nEnter value: ___\b\b\b");
get_short(value);
}
if(response == 3){
printf("\nEnter hi: ___\b\b\b");
get_short(hi);
}
if(response == 4){
printf("\nEnter low: ___\b\b\b");
get_short(low);
}
} /* ends while not_finished */
} /* ends get_threshold_options */
/***********************************************
*
* file d:\cips\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:
* 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
* 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
*
*************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -