edge_detect.m
上传用户:hjhzmdqc
上传日期:2020-07-06
资源大小:2k
文件大小:2k
源码类别:

图形图象

开发平台:

Matlab

  1. function e = edge_detect(a,sigma)  
  2.  [m,n] = size(a);
  3.  a=double(a);
  4.  e = false(m,n);
  5.  GaussianDieOff = .0001;  
  6.  PercentOfPixelsNotEdges = .7; % Used for selecting thresholds
  7.  ThresholdRatio = .4;
  8.  pw = 1:30; % possible widths
  9.   ssq = sigma^2;
  10.   width = find(exp(-(pw.*pw)/(2*ssq))>GaussianDieOff,1,'last');
  11.   if isempty(width)
  12.     width = 1;  % the user entered a really small sigma
  13.   end
  14.   t = (-width:width);
  15.   gau = exp(-(t.*t)/(2*ssq))/(2*pi*ssq);     % the gaussian 1D filter
  16.   [x,y]=meshgrid(-width:width,-width:width);
  17.   dgau2D=-x.*exp(-(x.*x+y.*y)/(2*ssq))/(pi*ssq);
  18.   aSmooth=imfilter(a,gau,'conv','replicate');   % run the filter accross rows
  19.   aSmooth=imfilter(aSmooth,gau','conv','replicate'); % and then accross columns
  20.   
  21.   %apply directional derivatives
  22.   ax = imfilter(aSmooth, dgau2D, 'conv','replicate');
  23.   ay = imfilter(aSmooth, dgau2D', 'conv','replicate');
  24.   mag = sqrt((ax.*ax) + (ay.*ay));
  25.   magmax = max(mag(:));
  26.   if magmax>0
  27.     mag = mag / magmax;   % normalize
  28.   end
  29.   
  30.   lowThresh  =   0.7*mean(mag(:));
  31.   highThresh =  2 * lowThresh;
  32.    idxStrong = []; 
  33. %   idxWeak = find(mag > lowThresh);
  34. %   e(idxWeak)=1;
  35. %   idxStrong = [idxStrong; idxWeak(mag(idxWeak) > highThresh)];
  36. %   rstrong = rem(idxStrong-1, m)+1;
  37. %   cstrong = floor((idxStrong-1)/m)+1;
  38. %   e = bwselect(e, cstrong, rstrong, 8);
  39. %  mag=uint8(255*mag);
  40. %  imshow(mag);
  41. % The next step is to do the non-maximum supression.  
  42.   % We will accrue indices which specify ON pixels in strong edgemap
  43.   % The array e will become the weak edge map.
  44.    
  45.   for dir = 1:4
  46.     idxLocalMax = cannyFindLocalMaxima(dir,ax,ay,mag);
  47.     idxWeak = idxLocalMax(mag(idxLocalMax) > lowThresh);
  48.      e(idxWeak)=1;
  49.     idxStrong = [idxStrong; idxWeak(mag(idxWeak) > highThresh)];
  50.   end
  51.   
  52.  if ~isempty(idxStrong) % result is all zeros if idxStrong is empty
  53.     rstrong = rem(idxLocalMax-1, m)+1;
  54.     cstrong = floor((idxLocalMax-1)/m)+1;
  55.     e = bwselect(e, cstrong, rstrong, 8);
  56.    % e = bwmorph(e, 'thin', 1);  % Thin double (or triple) pixel wide contours
  57.  end
  58.  % imshow(e);
  59. %   
  60.