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)
{