//************************************************************************** #include <iostream.h> #include <fstream.h> #include <math.h> #include "matrix.h" #include "edgedetect.h" //************************************************************************** #define MAX_ITER 0 //************************************************************************** void DetectEdge(Matrix *Edge, Matrix &Fr, Matrix &Fi) { cout << "Edge Detection begins...." << endl; cout.flush(); int height = Fr.nx; int width = Fr.ny; Matrix Fn_r(height, width), Fn_i(height, width); Matrix Fnn_r(height, width), Fnn_i(height, width); Fn_r = Fr; Fn_i = Fi; int n = 0; while (n < MAX_ITER) { ++n; Fnn_r.Zero(); Fnn_i.Zero(); int count = 0; for (int i = 1; i < height-1; i++) for (int j = 1; j < width-1; j++) { double angle = atan2(Fn_i.p[i][j], Fn_r.p[i][j]); if (angle < 0.0) angle += 2.0*Pi; int quadrant = ((int) rint(angle/(Pi/4.0)))%8; int i_incr = quadrant%4; if (i_incr && quadrant < 4) i_incr = +1; else if (i_incr && quadrant > 4) i_incr = -1; quadrant = (quadrant+2)%8; int j_incr = quadrant%4; if (j_incr && quadrant < 4) j_incr = +1; else if (j_incr && quadrant > 4) j_incr = -1; int in = i + i_incr; int jn = j + j_incr; double dotp = Fn_r.p[i][j]*Fn_r.p[in][jn]+Fn_i.p[i][j]*Fn_i.p[in][jn]; double f1 = sqrt(Fn_r.p[i][j]*Fn_r.p[i][j]+Fn_i.p[i][j]*Fn_i.p[i][j]); double f2 = sqrt(Fn_r.p[in][jn]*Fn_r.p[in][jn]+Fn_i.p[in][jn]*Fn_i.p[in][jn]); dotp /= f1*f2; double angle2 = atan2(Fn_i.p[i][j]-Fn_i.p[in][jn],Fn_r.p[i][j]-Fn_r.p[in][jn]); if (dotp > 0.0) { ++count; Fnn_r.p[in][jn] += Fn_r.p[i][j]; Fnn_i.p[in][jn] += Fn_i.p[i][j]; } else { Fnn_r.p[i][j] += Fn_r.p[i][j]; Fnn_i.p[i][j] += Fn_i.p[i][j]; } } Fn_r = Fnn_r; Fn_i = Fnn_i; cout << " Number of pixels updated during iteration " << n << " = " << count << "/" << height*width << endl; if (count == 0) break; } //Write2DTecplotFile(&Fn_r, &Fn_i, "out.tec"); double threshold = 0.0; Edge->Zero(); for (int i = 1; i < height; i++) for (int j = 1; j < width; j++) { float energy = 0.0; if (Fn_r.p[i-1][j] > threshold && Fn_r.p[i][j] < -threshold) energy += Fn_r.p[i-1][j] - Fn_r.p[i][j]; if (Fn_i.p[i][j-1] > threshold && Fn_i.p[i][j] < -threshold) energy += Fn_i.p[i][j-1] - Fn_i.p[i][j]; Edge->p[i][j] = energy/2.0; } cout << "Edge Detection ends!" << endl; cout.flush(); } //************************************************************************** void Combine2Images(GrayImage &Orig, GrayImage &Edge, GrayImage *Final) { /* GrayImage Edge2; Edge2 = Edge; Edge2.DilationNxN(3); */ for (int i = 0; i < Orig.height; i++) for (int j = 0; j < Orig.width; j++) { if (Edge.p[i][j] == 255) Final->p[i][j] = Edge.p[i][j]; else Final->p[i][j] = Orig.p[i][j]; } } //**************************************************************************