#include /* Marr-Hildreth.c (or marrh.c) */ #include #define PICSIZE 256 #define MAXMASK 100 int pic[PICSIZE][PICSIZE]; double outpic1[PICSIZE][PICSIZE]; double outpic2[PICSIZE][PICSIZE]; int edgeflag[PICSIZE][PICSIZE]; double mask[MAXMASK][MAXMASK]; double conv[PICSIZE][PICSIZE]; main(argc,argv) int argc; char **argv; { int i,j,p,q,s,t,mr,centx,centy; double maskval,sum,sig,maxival,minival,maxval,ZEROTOL; FILE *fo1, *fo2,*fp1, *fopen(); char *foobar; argc--; argv++; foobar = *argv; fp1=fopen(foobar,"rb"); argc--; argv++; foobar = *argv; fo1=fopen(foobar,"wb"); argc--; argv++; foobar = *argv; fo2=fopen(foobar,"wb"); argc--; argv++; foobar = *argv; sig = atof(foobar); argc--; argv++; foobar = *argv; ZEROTOL = atof(foobar); mr = (int)(sig * 3); centx = (MAXMASK / 2); centy = (MAXMASK / 2); for (i=0;i<256;i++) { for (j=0;j<256;j++) { pic[i][j] = getc (fp1); } } for (p=-mr;p<=mr;p++) { for (q=-mr;q<=mr;q++) { maskval = ((2-(((p*p)+(q*q))/(sig*sig)))* (exp(-1*(((p*p)+(q*q))/(2*(sig*sig)))))); (mask[p+centy][q+centx]) = maskval; } } for (i=mr;i<=255-mr;i++) { for (j=mr;j<=255-mr;j++) { sum = 0; for (p=-mr;p<=mr;p++) { for (q=-mr;q<=mr;q++) { sum += pic[i+p][j+q] * mask[p+centy][q+centx]; } } outpic1[i][j] = sum; conv[i][j] = sum; } } maxval = 0; maxival = 0; minival = 255; for (i=mr;i<256-mr;i++) { for (j=mr;j<256-mr;j++) { if (outpic1[i][j] > maxival) maxival = outpic1[i][j]; if (outpic1[i][j] < minival) minival = outpic1[i][j]; } } if (fabs(maxival) > fabs(minival)) maxval = fabs(maxival); else maxval = fabs(minival); for (i=0;i<256;i++) { for (j=0;j<256;j++) { outpic1[i][j] = ((((outpic1[i][j]) / maxval) + 1) * 127); fprintf(fo1,"%c",(char)((int)(outpic1[i][j]))); } } for (i=mr;i<=255-mr;i++) { for (j=mr;j<=255-mr;j++) { outpic2[i][j] = 0; if (conv[i][j] > ZEROTOL) { for (p=-1;p<=1;p++) { for (q=-1;q<=1;q++) { if (conv[i+p][j+q] < -ZEROTOL) { outpic2[i][j] = 255; } } } } else if ((fabs)(conv[i][j]) < ZEROTOL) { if (((conv[i+1][j] > ZEROTOL) && (conv[i-1][j] < -ZEROTOL)) || ((conv[i+1][j] < -ZEROTOL) && (conv[i-1][j] > ZEROTOL))) { outpic2[i][j] = 255; } else if (((conv[i][j+1] > ZEROTOL) && (conv[i][j-1] < -ZEROTOL)) || ((conv[i][j+1] < -ZEROTOL) && (conv[i][j-1] > ZEROTOL))) { outpic2[i][j] = 255; } else if (((conv[i+1][j+1] > ZEROTOL) && (conv[i-1][j-1] < -ZEROTOL)) || ((conv[i+1][j+1] < -ZEROTOL) && (conv[i-1][j-1] > ZEROTOL))) { outpic2[i][j] = 255; } else if (((conv[i+1][j-1] > ZEROTOL) && (conv[i-1][j+1] < -ZEROTOL)) || ((conv[i+1][j-1] < -ZEROTOL) && (conv[i-1][j+1] > ZEROTOL))) { outpic2[i][j] = 255; } } } } for (i=0;i<256;i++) { for (j=0;j<256;j++) { if (outpic2[i][j] == 255) outpic2[i][j]=0; else outpic2[i][j]=255; fprintf(fo2,"%c",(char)((int)(outpic2[i][j]))); } } }