Category : Files from Magazines
Archive   : CUJ9201.ZIP
Filename : 1001055A

 
Output of file : 1001055A contained in archive : CUJ9201.ZIP

/***********************************************
*
* file d:\cips\edge3.c
*
* Functions: This file contains
* gaussian_edge
* enhance_edges
*
* Purpose:
* These functions implement several
* types of advanced edge detection.
*
* External Calls:
* wtiff.c - does_not_exist
* round_off_image_size
* create_allocate_tiff_file
* write_array_into_tiff_image
* tiff.c - read_tiff_header
* rtiff.c - read_tiff_image
* numcvrt.c - get_integer
* edge.c - fix_edges
*
* Modifications:
* 26 March 1991 - created
*
*************************************************/


#include "d:\cips\cips.h"


short enhance_mask[3][3] = {
{-1, 0, -1},
{ 0, 4, 0},
{-1, 0, -1} };


short g7[7][7] = {
{ 0, 0, -1, -1, -1, 0, 0},
{ 0, -2, -3, -3, -3, -2, 0},
{ -1, -3, 5, 5, 5, -3, -1},
{ -1, -3, 5, 16, 5, -3, -1},
{ -1, -3, 5, 5, 5, -3, -1},
{ 0, -2, -3, -3, -3, -2, 0},
{ 0, 0, -1, -1, -1, 0, 0}};

short g9[9][9] = {
{ 0, 0, 0, -1, -1, -1, 0, 0, 0},
{ 0, -2, -3, -3, -3, -3, -3, -2, 0},
{ 0, -3, -2, -1, -1, -1, -2, -3, 0},
{ -1, -3, -1, 9, 9, 9, -1, -3, -1},
{ -1, -3, -1, 9, 19, 9, -1, -3, -1},

{ -1, -3, -1, 9, 9, 9, -1, -3, -1},
{ 0, -3, -2, -1, -1, -1, -2, -3, 0},
{ 0, -2, -3, -3, -3, -3, -3, -2, 0},
{ 0, 0, 0, -1, -1, -1, 0, 0, 0}};



/**************************************************
*
* gaussian_edge(...
*
*
***************************************************/

gaussian_edge(in_name, out_name, the_image, out_image,
il, ie, ll, le, size, threshold, high)
char in_name[], out_name[];
int high, il, ie, ll, le, size, threshold;
short the_image[ROWS][COLS], out_image[ROWS][COLS];
{
char response[80];
long sum;
int a, b, absdiff, absmax, diff, i, j,
length, lower, max, new_hi, new_low,
scale, start, stop, upper, width;

struct tiff_header_struct image_header;


if(does_not_exist(out_name)){
printf("\n\nGAUSSIAN> output file does not exist %s",
out_name);
read_tiff_header(in_name, &image_header);
round_off_image_size(&image_header,
&length, &width);
image_header.image_length = length*ROWS;
image_header.image_width = width*COLS;
create_allocate_tiff_file(out_name, &image_header,
out_image);
} /* ends if does_not_exist */

read_tiff_header(in_name, &image_header);

new_hi = 250;
new_low = 16;
if(image_header.bits_per_pixel == 4){
new_hi = 10;
new_low = 3;
}

max = 255;
if(image_header.bits_per_pixel == 4)
max = 16;


if(size == 7){
lower = -3;
upper = 4;
start = 3;
stop = ROWS-3;

scale = 2;
}

if(size == 9){
lower = -4;
upper = 5;
start = 4;
stop = ROWS-4;
scale = 2;
}


read_tiff_image(in_name, the_image, il, ie, ll, le);

for(i=0; i for(j=0; j out_image[i][j] = 0;


for(i=start; i if ( (i%10) == 0) printf(" i=%d", i);
for(j=start; j
sum = 0;

for(a=lower; a for(b=lower; b if(size == 7)
sum = sum + the_image[i+a][j+b] *
g7[a+3][b+3];
if(size == 9)
sum = sum + the_image[i+a][j+b] *
g9[a+4][b+4];
} /* ends loop over a */
} /* ends loop over b */

if(sum < 0) sum = 0;
if(sum > max) sum = max;
out_image[i][j] = sum;


} /* ends loop over j */
} /* ends loop over i */

/* if desired, threshold the output image */
if(threshold == 1){
for(i=0; i for(j=0; j if(out_image[i][j] > high){
out_image[i][j] = new_hi;
}
else{
out_image[i][j] = new_low;
}
}
}
} /* ends if threshold == 1 */


fix_edges(out_image, size/2);


write_array_into_tiff_image(out_name, out_image,
il, ie, ll, le);

} /* ends gaussian_edge */


/*******************************************
*
* enhance_edges(...
*
* This function enhances the edges in an
* input image and writes the enhanced
* result to an output image. It operates
* much the same way as detect_edges
* except it uses only one type of mask.
*
* The threshold and high parameters perform
* a different role in this function. The
* threshold parameter does not exist. The
* high parameter determines if the edge is
* strong enough to enhance or change the
* input image.
*
*******************************************/


enhance_edges(in_name, out_name, the_image, out_image,
il, ie, ll, le, high)
char in_name[], out_name[];
int high, il, ie, ll, le;
short the_image[ROWS][COLS], out_image[ROWS][COLS];

{
int a, b, i, j, k,
length, max, new_hi,
new_lo, sum, width;
struct tiff_header_struct image_header;


if(does_not_exist(out_name)){
printf("\n\nEE> output file does not exist %s",
out_name);
read_tiff_header(in_name, &image_header);
round_off_image_size(&image_header,
&length, &width);
image_header.image_length = length*ROWS;
image_header.image_width = width*COLS;
create_allocate_tiff_file(out_name, &image_header,
out_image);
} /* ends if does_not_exist */

read_tiff_header(in_name, &image_header);

max = 255;
if(image_header.bits_per_pixel == 4)
max = 16;



read_tiff_image(in_name, the_image, il, ie, ll, le);

/* Do convolution over image array */
for(i=1; i if( (i%10) == 0) printf("%d ", i);
for(j=1; j sum = 0;
for(a=-1; a<2; a++){
for(b=-1; b<2; b++){
sum = sum +
the_image[i+a][j+b] *
enhance_mask[a+1][b+1];
}
}
if(sum < 0) sum = 0;
if(sum > max) sum = max;
if(sum > high)
out_image[i][j] = max;
else
out_image[i][j] = the_image[i][j];
} /* ends loop over j */
} /* ends loop over i */

fix_edges(out_image, 1);


write_array_into_tiff_image(out_name, out_image,
il, ie, ll, le);
} /* ends enhance_edges */
/* End of File */