Page 86 -
P. 86

60    Chapter 2 ■ Edge-Detection Techniques



                             void convolution (IMAGE im, float **mask, int nr, int nc, float **res,
                                    int NR, int NC)
                             {
                                    int i,j,ii,jj, n, m, k, kk;
                                    float x, y;

                                    k = nr/2; kk = nc/2;
                                    for (i=0; i<NR; i++)
                                      for (j=0; j<NC; j++)
                                      {
                                        x = 0.0;
                                        for (ii=0; ii<nr; ii++)
                                        {
                                          n= i-k +ii;
                                          if (n<0 || n>=NR) continue;
                                          for (jj=0; jj<nc; jj++)
                                          {
                                          m= j-kk + jj;
                                          if (m<0 || m>=NC) continue;
                                          x += mask[ii][jj] * (float)(im->data[n][m]);
                                          }
                                        }
                                        res[i][j] = x;
                                      }
                             }
                             void zero_cross (float **lapim, IMAGE im)
                             {
                                    int i,j,k,n,m, dx, dy;
                                    float x, y, z;
                                    int xi,xj,yi,yj, count = 0;
                                    IMAGE deriv;

                                    for (i=1; i<im->info->nr-1; i++)
                                      for (j=1; j<im->info->nc-1; j++)
                                   {
                                   im->data[i][j] = 0;
                                   if(lapim[i-1][j]*lapim[i+1][j]<0){im->data[i][j]=255; continue;}
                                   if(lapim[i][j-1]*lapim[i][j+1]<0){im->data[i][j]=255; continue;}
                                   if(lapim[i+1][j-1]*lapim[i-1][j+1]<0){im->data[i][j]=255; continue;}
                                   if(lapim[i-1][j-1]*lapim[i+1][j+1]<0){im->data[i][j]=255; continue;}

                                   }
                             }

                             /*       An alternative way to compute a Laplacian     */
                             void dolap (float **x, int nr, int nc, float **y)
                             {
   81   82   83   84   85   86   87   88   89   90   91