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

图形图象

开发平台:

Matlab

  1. function idxLocalMax = cannyFindLocalMaxima(direction,ix,iy,mag)
  2. %
  3. % This sub-function helps with the non-maximum supression in the Canny
  4. % edge detector.  The input parameters are:
  5. %   direction - the index of which direction the gradient is pointing, 
  6. %               read from the diagram below. direction is 1, 2, 3, or 4.
  7. %   ix        - input image filtered by derivative of gaussian along x 
  8. %   iy        - input image filtered by derivative of gaussian along y
  9. %   mag       - the gradient magnitude image
  10. %
  11. %    there are 4 cases:
  12. %
  13. %                         The X marks the pixel in question, and each
  14. %         3     2         of the quadrants for the gradient vector
  15. %       O----0----0       fall into two cases, divided by the 45 
  16. %     4 |         | 1     degree line.  In one case the gradient
  17. %       |         |       vector is more horizontal, and in the other
  18. %       O    X    O       it is more vertical.  There are eight 
  19. %       |         |       divisions, but for the non-maximum supression  
  20. %    (1)|         |(4)    we are only worried about 4 of them since we 
  21. %       O----O----O       use symmetric points about the center pixel.
  22. %        (2)   (3)        
  23. [m,n] = size(mag);
  24. % Find the indices of all points whose gradient (specified by the 
  25. % vector (ix,iy)) is going in the direction we're looking at.  
  26. switch direction
  27.  case 1
  28.   idx = find((iy<=0 & ix>-iy)  | (iy>=0 & ix<-iy));
  29.  case 2
  30.   idx = find((ix>0 & -iy>=ix)  | (ix<0 & -iy<=ix));
  31.  case 3
  32.   idx = find((ix<=0 & ix>iy) | (ix>=0 & ix<iy));
  33.  case 4
  34.   idx = find((iy<0 & ix<=iy) | (iy>0 & ix>=iy));
  35. end
  36. % Exclude the exterior pixels
  37. if ~isempty(idx)
  38.   v = mod(idx,m);
  39.   extIdx = find(v==1 | v==0 | idx<=m | (idx>(n-1)*m));
  40.   idx(extIdx) = [];
  41. end
  42. ixv = ix(idx);  
  43. iyv = iy(idx);   
  44. gradmag = mag(idx);
  45. % Do the linear interpolations for the interior pixels
  46. switch direction
  47.  case 1
  48.   d = abs(iyv./ixv);
  49.   gradmag1 = mag(idx+m).*(1-d) + mag(idx+m-1).*d; 
  50.   gradmag2 = mag(idx-m).*(1-d) + mag(idx-m+1).*d; 
  51.  case 2
  52.   d = abs(ixv./iyv);
  53.   gradmag1 = mag(idx-1).*(1-d) + mag(idx+m-1).*d; 
  54.   gradmag2 = mag(idx+1).*(1-d) + mag(idx-m+1).*d; 
  55.  case 3
  56.   d = abs(ixv./iyv);
  57.   gradmag1 = mag(idx-1).*(1-d) + mag(idx-m-1).*d; 
  58.   gradmag2 = mag(idx+1).*(1-d) + mag(idx+m+1).*d; 
  59.  case 4
  60.   d = abs(iyv./ixv);
  61.   gradmag1 = mag(idx-m).*(1-d) + mag(idx-m-1).*d; 
  62.   gradmag2 = mag(idx+m).*(1-d) + mag(idx+m+1).*d; 
  63. end
  64. idxLocalMax = idx(gradmag>=gradmag1 & gradmag>=gradmag2);