我打算在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
答案 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
过滤结果以图形方式显示:
请参阅?正如您所料,边框上的像素正好确实具有负值。另一方面,边框旁边的像素具有正值!值大于信号恒定区域的值。这些是您在结果中看到的“白色”值。
数学上,这也很容易解释。看看你使用的面具
我已经绘制了它,因此更容易看到巨大山谷周围的小山峰。简单来说,它们使边界周围的滤波值比其他像素具有更大的幅度,从而具有“边界识别”的效果。
我已经绘制了使用matlab函数fspecial('log')
创建的蒙版。在这个maks中,峰值更容易被发现。
祝你好运
答案 1 :(得分:0)
这与计算卷积的方式有关。当您的内核(您的掩码)在边框中进行卷积时,内核会到达原始图像之外的区域。关于该做什么有一些选择:
当假定图像外部区域为零且边框值较高(例如图像中)时,将检测到边缘,因为您正从高值踩到零。
如果使用imfilter,默认情况下该函数假定该区域为0.您可以使用“replicate”选项(因此外部区域与边框相同),它应该可以解决此问题。
您可以在官方文档中阅读更多相关信息: http://www.mathworks.com/help/toolbox/images/ref/imfilter.html
此外,生成的图像大小不同,因为外部区域包含在结果中。如果使用imfilter,则默认情况下会裁剪此区域。
我假设您正在使用conv2函数,默认情况下这两个问题都存在。
PS:我有段时间没用过这个。如果imfilter完全像我说的那样工作,或者你需要其他任何东西,请告诉我。答案 2 :(得分:0)
只是一个简单的解决方案: 使用
imshow(image,[])
而不是
imshow(image)