2012-04-02 13 views
7

Sto cercando di eseguire un rilevatore di bordi canny senza chiamare la funzione canny in Matlab. Ho scritto alcune funzioni per il filtro gaussiano (sigma = 1) e la soppressione non massima. L'immagine originale e l'immagine risultante è mostrato .. Non sono sicuro che l'errore ...Rivelatore di bordo Canny in MATLAB

L'immagine originale è

enter image description here

L'output che ottengo è

enter image description here

Ho allegato il codice:

%% Read in 
I = imread('fruit.jpg'); 
figure(1),imshow(I) 
I = double(I); 
%% Determine Mask Size 
sigma = 2; 
w = mask_size(sigma); 
%% Gaussian Smoothing Filter 
[ G,sum ] = gauss_mask(w,sigma); 
%% Convolve 
I1 = (1/sum) * image_convolution(I,w,G); 
figure(2),imshow(I1); 
%% Ix(derivative in x-direction) 
Ix= delx(I1); 
figure(3),imshow(Ix); 
%% Iy(derivative in y-direction) 
Iy= dely(I1); 
figure(4),imshow(Iy); 
%% Gradient Magnitude 
If = grad_mag(Ix,Iy); 
figure(5),imshow(If); 
%% Non-maxmimum suppression 
It = suppression(If,abs(Ix),abs(Iy)); 
figure(6),imshow(It); 



function [ G,sum ] = gauss_mask(w,sigma) 
min = 1; 
m = floor(w/2); 
sum = 0; 
for x = 1: w 
    for y = 1:w 
     g = x-m-1; 
     h = y-m-1; 
     k = -(g^2 +h^2)/(2*sigma^2); 
     G(x,y) = exp(k); 
     sum = sum + G(x,y); 
     if min > G(x,y) 
      min = G(x,y); 
     end 
    end 
end 
B=1/min; 
G= B * G; 
G = round(G); 
end 


function [ I2 ] = image_convolution(I,w,G) 
m= (w-1)/2; 
N= size(I,1); 
M=size(I,2); 
for i=1:N 
    for j=1:M 
     if (i > N-m-1 || j > M-m-1 || i<m+1 || j <m+1) 
      I2(i,j) = 0; 
      continue; 
     end 
     sum1 = 0; 
     for u=1:w 
      for v=1:w 
       sum1 = sum1+I(i+u-m-1,j+v-m-1)*G(u,v); 
      end 
     end 
     I2(i,j)=sum1; 
    end 
end 
end 


function [ Ix ] = delx(image) 
mask = [-1 0 1; -2 0 2; -1 0 1]; 
Ix =image_convolution(image,3,mask); 
end 

function [ Iy ] = dely(image) 
mask = [-1 -2 -1;0 0 0;1 2 1]; 
Iy =image_convolution(image,3,mask); 
end 

function [ Imag ] = grad_mag(Ix,Iy) 
m=size(Ix,1); 
n=size(Ix,2); 
for i=1:m 
    for j=1:n 
      Imag(i,j) =sqrt(Ix(i,j)^2 + Iy(i,j)^2); 
    end 
end 
end 

function [ It ] = suppression(If,Ix,Iy) 
m=size(Ix,1); 
n=size(Ix,2); 
for i = 1:m 
    for j=1:n 
      if (j == 1 || j == n || i == 1 || j == n) 
       It(i,j) = 0; 
      else if (Ix(i,j)*Iy(i,j)> 0) 
       f1 =If(i-1,j-1); 
       f2 =If(i,j); 
       f3 =If(i+1,j+1); 
       It(i,j) = thinning(f1,f2,f3); 
       else if(Ix(i,j)*Iy(i,j)< 0) 
        f1 =If(i+1,j-1); 
        f2 =If(i,j); 
        f3 =If(i-1,j+1); 
        It(i,j) = thinning(f1,f2,f3); 
        else if(abs(Ix(i,j))-abs(Iy(i,j))>5) 
          f1 =If(i-1,j); 
          f2 =If(i,j); 
          f3 =If(i+1,j); 
          It(i,j) = thinning(f1,f2,f3); 
          else if(abs(Iy(i,j))-abs(Ix(i,j)) > 5) 
           f1 =If(i,j-1); 
           f2 =If(i,j); 
           f3 =If(i,j+1); 
           It(i,j) = thinning(f1,f2,f3); 
           end 
         end 
        end 
       end 
      end 
    end 
end 

end 

function [ w ] = thinning(f1,f2,f3) 
if(f2>f1 && f2>f3) 
    w =1; 
else 
    w= 0; 
end 
end 

function sz = mask_size(sigma) 
sz = floor(6*sigma) + 1; 
end 

C'è molto rumore ... come posso risolvere l'errore? Ho bisogno di aiuto ....

+0

Si ottiene lo stesso risultato con un valore sigma più alto? Inoltre, come funziona la funzione 'mask_size'? Di solito è una buona idea usare una maschera di dimensioni di (6 * sigma + 1). –

+0

Dov'è la tua soglia? hai bisogno della soglia bassa e alta – hmfarimani

risposta

4

errore è in realtà in funzione di diradamento.

if(f2>f1 && f2>f3) 
     w =f2; 
    else  
     w= 0; 
3

Si dovrebbe fare entrambe le cose:

  1. Smooth immagine per eliminare il rumore (conv with a gaussian matrix) prima di fare qualsiasi manipolazione su di esso.
  2. Prendere una soglia più elevata in Hysteresis parte dell'algoritmo:

Prendere T1 più grande quando si esegue questa parte dell'algoritmo:

Define two thresholds T1 > T2 

for every pixel with value greater than T1 is presumed to be an edge pixel. 
+0

ho già livellato l'immagine con la matrice gaussiana ... come fai la parte hystersis? fallo prima della soppressione non massima o dopo? – lakesh

+0

Aggiunto un collegamento all'isteresi, sperare sia sufficiente – 0x90

+0

la massima compressione non viene sempre eseguita prima – vini

0

Il tuo problema è alla soglia aggiungere un forte limitatore per sbarazzarsi dei falsi bordi.

Per prima cosa è necessario uniformare l'immagine con una funzione gaussiana. Quindi trova il gradiente e la grandezza dell'immagine di input. Esegui la soppressione non maxima. Dopodiché effettua la soglia di isteresi.

0

Vedendo la vostra uscita bordo Immagine, posso dire che si dovrebbe verificare ..

  1. isteresi Funzione funziona correttamente o non
  2. Si può prendere soglia HIGH po 'più alto
  3. è possibile regolare l'immagine poco più.