2012-04-02 13 views
7

Estoy tratando de realizar un detector de bordes astuto sin llamar a la función canny en Matlab. Escribí algunas funciones para el filtro gaussiano (sigma = 1) y supresión no máxima. La imagen original y la imagen resultante se muestra .. No estoy seguro que el error ...Detector de bordes cana en MATLAB

la imagen original es

enter image description here

La salida me sale es

enter image description here

He adjuntado el código:

%% 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 

Hay mucho ruido ... ¿cómo puedo resolver el error? Necesito ayuda ....

+0

¿Obtiene el mismo resultado con un valor de sigma más alto? Además, ¿cómo funciona tu función 'mask_size'? Por lo general, es una buena idea usar un tamaño de máscara de (6 * sigma + 1). –

+0

¿Dónde está su umbral? necesita umbral bajo y alto – hmfarimani

Respuesta

4

error es en realidad en función de adelgazamiento.

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

Usted debe hacer ambas cosas: Imagen

  1. Smooth para eliminar el ruido (conv with a gaussian matrix) antes de hacer cualquier manipulación de la misma.
  2. Tome un umbral más alto en Hysteresis parte del algoritmo:

Take grande T1 cuando se hace esta parte del algoritmo:

Define two thresholds T1 > T2 

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

ya he suavizado la imagen con la matriz gaussiana ... ¿cómo se hace la parte de la histéresis? hacerlo antes de la supresión no máxima o después? – lakesh

+0

Agregó un enlace a histéresis, espero que sea suficiente – 0x90

+0

supresión no máxima siempre se hace primero – vini

0

Tu problema está en alcanzar el umbral agregar un fuerte lider para quitar los bordes falsos.

Primero tiene que suavizar la imagen con una función gaussiana. Luego encuentra el gradiente y la magnitud de la imagen de entrada. Realice supresión no máxima. Después de eso, haz el umbral de histéresis.

0

Ver a su salida de bordes de imagen, lo que puedo decir que usted debe comprobar ..

  1. histéresis Función está funcionando correctamente o no
  2. Usted puede tomar umbral HIGH poco más alto
  3. puede suavizar la imagen poco más.
Cuestiones relacionadas