【问题标题】:Laplacian of Gaussian (LOG) edge detector in MATLABMATLAB中的高斯拉普拉斯算子(LOG)边缘检测器
【发布时间】:2012-04-25 00:24:14
【问题描述】:

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

【问题讨论】:

  • 你在使用 imshow 来绘制你的图像吗?
  • ya..我正在使用 imshow...
  • 它们应该是白色的。您使用的内核仅适用于“拉普拉斯算子”。顾名思义,高斯的拉普拉斯算子,首先取图像的高斯。为什么你不能在谷歌上搜索一次?真的值得在论坛上提问吗?无论如何..这是link

标签: matlab computer-vision


【解决方案1】:

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

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

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

如果你使用imfilter,该函数默认假设这个区域为0。你可以使用'replicate'选项(所以外部区域与边界相同),它应该可以解决这个问题。

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

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

我假设您使用的是 conv2 函数,默认情况下这两个问题都有。

PS:我有一段时间没用过这个了。如果 imfilter 的工作方式与我所说的完全一样,或者您还需要其他什么,请告诉我。

【讨论】:

  • 如果你真的想用你自己的,那么你必须适应得到你需要的东西。但是除了了解它是如何工作的之外,重新发明轮子并没有任何好处,而且您将使用现有的功能获得更好、更快的结果。
【解决方案2】:

一个简单的测试就能回答你所有的问题:

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

过滤结果以图形方式显示:

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

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

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

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

最好的问候

【讨论】:

  • 嗨,我真的很好奇你是如何渲染 3D 矩阵的。我真的很难用谷歌搜索如何做到这一点。谢谢。
  • Nvm。我猜这是bar3?它没有在 Octave 中实现,这就是我现在想要摆脱的。但是有各种解决方法,所以很酷
【解决方案3】:

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

imshow(image,[])

代替

imshow(image)

【讨论】:

    猜你喜欢
    • 2014-03-29
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多