Advertisement
Guest User

Untitled

a guest
Dec 20th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Octave 2.78 KB | None | 0 0
  1. function [newImg, tgTeta] = edgeDetect(img)
  2.   smoothImg = smoothImage(img);
  3.   [dx, dy] = computeGradient(img);
  4.   tgTeta = dy ./ dx;
  5.   [labels] = computeLabels(tgTeta);
  6.   G = hypot(dx, dy);
  7.   interImg = nonMaxSupress(G, labels);
  8.   newImg = hysteresis(interImg, G);
  9.   newImg = newImg(2:end-1, 2:end-1);
  10. endfunction
  11.  
  12.  
  13. function [newImg] = hysteresis(G)
  14.   high = 0.04;%mean(G(:)) * 4;
  15.   low = 0.001; %mean(G(:)) * 1.5;
  16.   [R, C] = size(G);
  17.   newImg = zeros(R, C);
  18.   for i = 2:R - 1
  19.     for j = 2:C - 1
  20.       newImg(i, j) = newImg(i, j) || G(i, j) > high;
  21.       newImg(i, j) = newImg(i,j) || (G(i, j) > low && any(getNeighbors(newImg, i, j)) == 1);
  22.     endfor
  23.   endfor
  24.  
  25.   for i = R-1:-1:2
  26.     for j = C-1:-1:2
  27.       newImg(i, j) = newImg(i, j) || G(i, j) > high;
  28.       newImg(i, j) = newImg(i,j) || (G(i, j) > low && any(getNeighbors(newImg, i, j)) == 1);
  29.     endfor
  30.   endfor
  31. endfunction
  32.  
  33. function [neighbors] = getNeighbors(img, i, j)
  34.   neighbors = [img(i - 1, j - 1)
  35.                img(i - 1, j)
  36.                img(i - 1, j + 1)
  37.                img(i, j - 1)
  38.                img(i, j + 1)
  39.                img(i + 1, j - 1)
  40.                img(i + 1, j)
  41.                img(i + 1, j + 1)];
  42. endfunction
  43.  
  44.  
  45. function [edges] = nonMaxSupress(G, labels)
  46.   G = padarray(G, [1, 1], 'both');
  47.   labels = padarray(labels, [1, 1], 'both');
  48.   [R, C] = size(G);
  49.   edges = zeros(size(G));
  50.   for i = 2:R - 1
  51.     for j = 2:C - 1
  52.       label = labels(i, j);
  53.       if (label == 0 && G(i, j) > G(i, j - 1) && G(i, j) > G(i, j + 1))
  54.         edges(i, j) = G(i, j);
  55.       endif
  56.      
  57.       if (label == 1 && G(i, j) > G(i + 1, j - 1) && G(i, j) > G(i - 1, j + 1))
  58.         edges(i, j) = G(i, j);
  59.       endif
  60.      
  61.       if (label == 2 && G(i, j) > G(i + 1, j) && G(i, j) > G(i - 1, j))
  62.         edges(i, j) = G(i, j);
  63.       endif
  64.      
  65.       if (label == 3 && G(i, j) > G(i - 1, j - 1) && G(i, j) > G(i + 1, j + 1))
  66.         edges(i, j) = G(i, j);
  67.       endif
  68.     endfor
  69.   endfor
  70. endfunction
  71.  
  72. function [smoothImg] = smoothImage(img)
  73.   smoothImg = conv2(img, ones(5)/25, 'same');
  74. endfunction
  75.  
  76.  
  77. function [dx, dy] = computeGradient(img)
  78.   derivativeVector = [-1, 1];
  79.   dx = conv2(img, derivativeVector, 'same');
  80.   dy = conv2(img, transpose(derivativeVector), 'same');
  81. endfunction
  82.  
  83.  
  84. function [labels] = computeLabels(tgTeta)
  85.   [R, C] = size(tgTeta);
  86.   labels = zeros(size(tgTeta));
  87.   for i = 1:R
  88.     for j = 1:C
  89.       labels(i, j) = getLabel(tgTeta(i, j));
  90.     endfor
  91.   endfor
  92. endfunction
  93.  
  94. function [label] = getLabel(tgTeta)
  95.    
  96.   label = 0;
  97.    
  98.   if (0.4142 < tgTeta && tgTeta < 2.4142)
  99.     label = 1;
  100.    
  101.   elseif (2.4142 <= abs(tgTeta) || isinf(tgTeta))
  102.     label = 2;
  103.    
  104.   elseif (-2.4142 < tgTeta && tgTeta <= -0.4142)
  105.     label = 3;
  106.    
  107.   endif
  108.  
  109. endfunction
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement