Listing 2 (edge3.c)

      /***********************************************
      *
      *       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_perpixel == 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<ROWS; i++)
      for(j=0; j<COLS; j++)
         out_image[i] [j] = 0;


   for(i=start; i<stop; i++){
      if ((i%10) == 0) printf(" i=%d", i);
      for(j=start; j<stop; j++){

      sum = 0;

      for(a=lower; a<upper; a++){
         for(b=lower; b<upper; 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<ROWS; i++){
         for(j=0; j<COLS; 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<ROWS-1; i++){
      if((i%10) == 0) printf("%d ", i);
      for(j=1; j<COLS-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 */