1

我打算在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];

原图是

在此处输入图像描述

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

在此处输入图像描述

我的问题是为什么图像中的边缘看起来是白色而不是黑色(= 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
4

3 回答 3

9

一个简单的测试可以回答你所有的问题:

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

过滤结果以图形方式显示: 在此处输入图像描述

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

从数学上讲,这也很容易解释。看看你用的面膜

使用的 LoG 掩码

我已经绘制了它,以便更容易看到大山谷周围的小山峰。简单来说,就是让边界周围的过滤值比其他像素有更大的幅度,从而产生“边界识别”的效果。

我已经绘制了使用 matlab 函数创建的掩码fspecial('log')。在这个制作中,山峰更容易被发现。 在此处输入图像描述

最好的祝福

于 2012-04-13T20:49:34.783 回答
0

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

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

当图像外部的区域被假定为零并且边界值很高(例如在您的图像中)时,将检测到边缘,因为您正在从一个高值步进到零。

如果使用 imfilter,该函数默认假定该区域为 0。您可以使用选项“复制”(因此外部区域与边界相同),它应该可以解决这个问题。

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

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

我假设您使用的是 conv2 函数,默认情况下它同时存在这两个问题。

PS:我有一段时间没用过这个了。让我知道 imfilter 是否像我说的那样工作,或者您需要其他任何东西。

于 2012-04-12T16:23:42.620 回答
0

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

imshow(image,[])

代替

imshow(image)

于 2016-02-16T01:21:55.163 回答