MATLAB中高斯(LOG)边缘检测器的拉普拉斯算子

时间:2012-04-12 15:55:23

标签: matlab computer-vision

我打算在matlab中使用高斯边缘算子的拉普拉斯算子。

这是我的知识

LOG operators are second-order deriatives operator. Second order deriatives operator result in zero-crossing. At the step, position where 1st deriative is maximum is where the second deriative has zero crossing.

我使用的掩码是mask = [0 1 0; 1 -4 1; 0 1 0];

原始图片是

enter image description here

我得到的输出来自原始图像

enter image description here

我的问题是为什么图像中的边缘显示为白色而不是黑色(= 0)。它应该是黑色的吗?我是对还是错?任何人都可以解释一下吗?

卷积功能:

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

3 个答案:

答案 0 :(得分:10)

简单的测试可以回答您的所有问题:

log_mask = [0 1 0; 1 -4 1; 0 1 0];

vertical_bar = zeros(11);
vertical_bar(:,5) = 1;
bar_filtered = image_convolution(vertical_bar, 3, log_mask)

box = zeros(11);
box(3:7,3:7) = 1;
box_filtered = image_convolution(box, 3, log_mask)

figure;
subplot(2,2,1); imshow(vertical_bar,[]); title('Vertical Bar');
subplot(2,2,2); imshow(bar_filtered,[]);title('Vertical Bar LoG Filtered');
subplot(2,2,3); imshow(box,[]);title('Box');
subplot(2,2,4); imshow(box_filtered,[]);title('Box LoG Filtered');


# Output:
#
# bar_filtered =
# 0     0     0     0     0     0     0     0     0     0     0
# 0     0     0     1    -2     1     0     0     0     0     0
# 0     0     0     1    -2     1     0     0     0     0     0
# 0     0     0     1    -2     1     0     0     0     0     0
# 0     0     0     1    -2     1     0     0     0     0     0
# 0     0     0     1    -2     1     0     0     0     0     0
# 0     0     0     1    -2     1     0     0     0     0     0
# 0     0     0     1    -2     1     0     0     0     0     0
# 0     0     0     1    -2     1     0     0     0     0     0
# 0     0     0     0     0     0     0     0     0     0     0
# 0     0     0     0     0     0     0     0     0     0     0

#box_filtered =

# 0     0     0     0     0     0     0     0     0     0     0
# 0     0     1     1     1     1     1     0     0     0     0
# 0     1    -2    -1    -1    -1    -2     1     0     0     0
# 0     1    -1     0     0     0    -1     1     0     0     0
# 0     1    -1     0     0     0    -1     1     0     0     0
# 0     1    -1     0     0     0    -1     1     0     0     0
# 0     1    -2    -1    -1    -1    -2     1     0     0     0
# 0     0     1     1     1     1     1     0     0     0     0
# 0     0     0     0     0     0     0     0     0     0     0
# 0     0     0     0     0     0     0     0     0     0     0
# 0     0     0     0     0     0     0     0     0     0     0

过滤结果以图形方式显示: enter image description here

请参阅?正如您所料,边框上的像素正好确实具有负值。另一方面,边框旁边的像素具有正值!值大于信号恒定区域的值。这些是您在结果中看到的“白色”值。

数学上,这也很容易解释。看看你使用的面具

LoG mask used

我已经绘制了它,因此更容易看到巨大山谷周围的小山峰。简单来说,它们使边界周围的滤波值比其他像素具有更大的幅度,从而具有“边界识别”的效果。

我已经绘制了使用matlab函数fspecial('log')创建的蒙版。在这个maks中,峰值更容易被发现。 enter image description here

祝你好运

答案 1 :(得分:0)

这与计算卷积的方式有关。当您的内核(您的掩码)在边框中进行卷积时,内核会到达原始图像之外的区域。关于该做什么有一些选择:

  • 您可以假设该外部区域的值为0,
  • 与边框具有相同的值
  • 或与图像的另一侧相同,就像图像是周期性的(圆形)一样。

当假定图像外部区域为零且边框值较高(例如图像中)时,将检测到边缘,因为您正从高值踩到零。

如果使用imfilter,默认情况下该函数假定该区域为0.您可以使用“replicate”选项(因此外部区域与边框相同),它应该可以解决此问题。

您可以在官方文档中阅读更多相关信息: http://www.mathworks.com/help/toolbox/images/ref/imfilter.html

此外,生成的图像大小不同,因为外部区域包含在结果中。如果使用imfilter,则默认情况下会裁剪此区域。

我假设您正在使用conv2函数,默认情况下这两个问题都存在。

PS:我有段时间没用过这个。如果imfilter完全像我说的那样工作,或者你需要其他任何东西,请告诉我。

答案 2 :(得分:0)

只是一个简单的解决方案: 使用

imshow(image,[])

而不是

imshow(image)