Canny edge detector in MATLAB

29,537

Solution 1

Error is actually at thinning function.

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

Solution 2

You should do both:

  1. Smooth image to eliminate noise (conv with a gaussian matrix) before do any manipulation on it.
  2. Take a higher threshold in Hysteresis part of the algorithm:

Take larger T1 when you do this part of the algorithm:

Define two thresholds T1 > T2

for every pixel with value greater than T1 is presumed to be an edge pixel.
Share:
29,537
lakshmen
Author by

lakshmen

Loves Programming and very keen in learning new things... NSMutableArray *skills = @[ @"C++", @"Python", @"Objective-C", @"Matlab", @"VBA", @"R", ]; Any questions regarding the codes, do feel free to contact me. My Email address can be obtained using this code in MATLAB: s = char(double([99 110 110 108 97 107 115 104 109 101 110 95 50 48 48 48 64 121 97 104 111 111 46 99 111 109])) clc; disp(s); disp(' '); You can connect with me in Linkedin

Updated on July 09, 2022

Comments

  • lakshmen
    lakshmen almost 2 years

    I am trying to perform canny edge detector without calling the canny function in Matlab. I wrote a few functions for the gaussian filter(sigma = 1) and non-maximum suppression. The original image and the resultant image is shown.. Not sure what the error...

    The original image is

    enter image description here

    The output i get is

    enter image description here

    I have attached the code :

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

    There is a lot of noise... how can i solve the error? i need some help....