图像处理中的均值掩模和拉普拉斯掩模

7

在一个应用程序中,我对输入图像应用平均掩模以减少噪音,然后使用拉普拉斯掩模增强小细节。请问如果我在Matlab中反转这些操作的顺序,是否会得到相同的结果?

3个回答

8

使用拉普拉斯核进行卷积类似于使用强度变化的二阶导数信息。由于该导数对噪声敏感,因此我们通常在应用拉普拉斯滤波器之前使用高斯平滑图像。


这是一个类似于@belisarius发布的MATLAB示例:

f='http://upload.wikimedia.org/wikipedia/commons/f/f4/Noise_salt_and_pepper.png';
I = imread(f);

kAvg = fspecial('average',[5 5]);
kLap = fspecial('laplacian',0.2);

lapMask = @(I) imsubtract(I,imfilter(I,kLap));

subplot(131), imshow(I)
subplot(132), imshow( imfilter(lapMask(I),kAvg) )
subplot(133), imshow( lapMask(imfilter(I,kAvg)) )

enter image description here


谢谢!当程序被反转时会发生什么? - Glove
@biz: “thron of three”解释得很好,可以参考他的回答。 - Amro

7
假设您有两个滤波器F1F2,以及一张图像I。如果您将图像通过这两个滤波器,您将得到一个被定义为响应的结果。
X = ((I * F1) * F2)

在这里,我使用*来代表卷积

根据卷积的结合律,这与以下式子相同。

X = (I * (F1 * F2))

使用交换律,我们可以说:
X = (I * (F2 * F1)) = ((I * F2) * F1)

当然,这是在数学的连续领域中,但在计算机上进行这些操作意味着会有舍入误差和一些数据可能会丢失。您还应该考虑您的滤波器是否为FIR,否则,将数字滤波视为卷积的整个概念开始崩溃,因为您的滤波器无法像您想要的那样运作。

编辑

离散卷积定义为

conv2 uses a straightforward formal implementation of the two-dimensional convolution equation in spatial form

因此,在数据边缘添加零在数学意义上并没有改变任何东西。

正如一些人指出的那样,您将在数字上获得不同的答案,但这在我们处理实际数据时是预期的。这些变化应该很小,并且仅限于卷积输出的低能量部分(即边缘)。

还要考虑卷积操作的工作方式。对长度为X和长度为Y的两组数据进行卷积将导致一个长度为X+Y-1的答案。对于像MATLAB和Mathematica这样的程序,有一些幕后魔法可以给您一个长度为XY的答案。

因此,关于@belisarius的帖子,似乎我们真的在说同样的事情。


应用图像滤镜通常需要一些填充(特别是为每个滤镜设置的,取决于图像边界上的值)。这会破坏交换律。 - Dr. belisarius
@belisarius 我不确定我理解填充(零或其他)如何会破坏卷积的交换律。你能提供一个证明吗? - thron of three
@belisarius 我觉得我们可能在这里说的是同样的事情。请看我的编辑。 - thron of three

3
数字结果不完全相同,但图像看起来非常相似。
在Mathematica中的示例:

enter image description here

编辑

作为对@thron在他的回答中关于线性滤波和填充的交换评论的回应,只需考虑以下操作。

虽然不填充时高斯和拉普拉斯滤波器的交换是正确的:

list = {1, 3, 5, 7, 5, 3, 1};
gauss[x_] := GaussianFilter[ x, 1]
lapl[x_] := LaplacianFilter[x, 1]
Print[gauss[lapl[list]], lapl[gauss[list]]]
(*
->{5.15139,0.568439,-1.13688,-9.16589,-1.13688,0.568439,5.15139}    
  {5.15139,0.568439,-1.13688,-9.16589,-1.13688,0.568439,5.15139}
*)

对于填充,同样的操作会导致边缘的差异:

gauss[x_] := GaussianFilter[ x, 1, Padding -> 1]
lapl[x_] := LaplacianFilter[x, 1, Padding -> 1]
Print[gauss[lapl[list]], lapl[gauss[list]]]

(*
->{4.68233,0.568439,-1.13688,-9.16589,-1.13688,0.568439,4.68233}
  {4.58295,0.568439,-1.13688,-9.16589,-1.13688,0.568439,4.58295}
*)

哇,非常感谢。如果可以的话,您能否在Matlab中提供一个示例? - Glove
@biz 抱歉,我没有Matlab可用。我相信其他成员可以发布它。希望对你有帮助! - Dr. belisarius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接