【问题标题】:Canny edge detector in MATLABMATLAB 中的 Canny 边缘检测器
【发布时间】:2012-04-16 12:18:38
【问题描述】:

我正在尝试在不调用 Matlab 中的精明函数的情况下执行精明边缘检测器。我为高斯滤波器(sigma = 1)和非极大值抑制写了一些函数。显示原始图像和生成的图像..不确定错误是什么...

原图是

我得到的输出是

我已附上代码:

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

有很多噪音...我该如何解决这个错误?我需要一些帮助....

【问题讨论】:

  • 您是否会以更高的 sigma 值获得相同的结果?另外,你的函数'mask_size'是如何工作的?使用 (6*sigma + 1) 的掩码大小通常是个好主意。
  • 你的门槛在哪里?你需要低门槛和高门槛

标签: matlab image-processing computer-vision edge-detection


【解决方案1】:

你应该同时做:

  1. Smooth 图像在对其进行任何操作之前消除噪音 (conv with a gaussian matrix)。
  2. 在算法的Hysteresis部分取更高的阈值:

在执行这部分算法时取更大的 T1:

Define two thresholds T1 > T2

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

【讨论】:

  • 我已经用高斯矩阵平滑了图像......你如何做滞后部分?在非最大抑制之前还是之后?
  • 加了迟滞的链接,希望够用了
【解决方案2】:

错误实际上是在细化函数上。

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

【讨论】:

    【解决方案3】:

    您的问题是在阈值化时添加一个强大的阈值器以消除错误边缘。

    首先,您必须使用高斯函数对图像进行平滑处理。然后找到输入图像的梯度和幅度。执行非极大值抑制。之后进行滞后阈值处理。

    【讨论】:

      【解决方案4】:

      看到你的输出边缘图像,我可以说你应该检查..

      1. 迟滞功能是否正常工作
      2. 您可以将 HIGH 阈值提高一点
      3. 您可以使图像更加平滑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-31
        • 1970-01-01
        • 1970-01-01
        • 2014-03-30
        • 2010-11-26
        • 2017-04-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多