Page 91 -
P. 91

Chapter 2 ■ Edge-Detection Techniques    65



                                 /*      TRACE - recursively trace edge pixels that have a
                                                 threshold > the low edge threshold, continuing
                                                 from the pixel at (i,j). */

                                 int trace (int i, int j, int low, IMAGE im,IMAGE mag, IMAGE ori)
                                 {
                                        int n,m;
                                        char flag = 0;

                                        if (im->data[i][j] == 0)
                                        {
                                          im->data[i][j] = 255;
                                          flag=0;
                                          for (n= -1; n<=1; n++)
                                          {
                                            for(m= -1; m<=1; m++)
                                            {
                                              if (i==0 && m==0) continue;
                                              if (range(mag, i+n, j+m) && mag->data[i+n][j+m] >= low)
                                               if (trace(i+n, j+m, low, im, mag, ori))
                                               {
                                                  flag=1;
                                                  break;
                                               }
                                            }
                                            if (flag) break;
                                          }
                                          return(1);
                                        }
                                        return(0);
                                 }
                                 void seperable_convolution (IMAGE im, float *gau, int width,
                                               float **smx, float **smy)
                                 {
                                        int i,j,k, I1, I2, nr, nc;
                                        float x, y;

                                        nr = im->info->nr;
                                        nc = im->info->nc;

                                        for (i=0; i<nr; i++)
                                          for (j=0; j<nc; j++)
                                          {
                                            x = gau[0] * im->data[i][j]; y = gau[0] * im->data[i][j];
                                            for (k=1; k<width; k++)
                                            {
                                              I1 = (i+k)%nr; I2 = (i-k+nr)%nr;
                                              y += gau[k]*im->data[I1][j] + gau[k]*im->data[I2][j];
                                              I1 = (j+k)%nc; I2 = (j-k+nc)%nc;
   86   87   88   89   90   91   92   93   94   95   96