在给定的应用程序中,我将平均蒙版应用于输入图像以减少噪声,然后使用拉普拉斯蒙版来增强小细节。任何人都知道如果我在 Matlab 中颠倒这些操作的顺序,我是否会得到相同的结果?
3 回答
与拉普拉斯核卷积类似于使用关于强度变化的二阶导数信息。由于该导数对噪声敏感,因此我们通常在应用拉普拉斯滤波器之前使用高斯对图像进行平滑处理。
这是一个类似于@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)) )
假设您有两个过滤器F1
和F2
,和一个图像I
。如果您通过两个过滤器传递您的图像,您将得到一个定义为的响应
X = ((I * F1) * F2)
我在这里*
用来表示卷积。
根据卷积的关联规则,这是相同的。
X = (I * (F1 * F2))
使用交换律,我们可以说
X = (I * (F2 * F1)) = ((I * F2) * F1)
当然,这是在数学的连续领域,在机器上做这些事情意味着会有舍入错误,一些数据可能会丢失。您还应该考虑您的过滤器是否为FIR,否则将数字过滤视为卷积排序的整个概念开始崩溃,因为您的过滤器不能真正按照您想要的方式运行。
编辑
离散卷积定义为
因此,在数据边缘添加零不会在数学意义上改变任何内容。
正如一些人所指出的,你会在数字上得到不同的答案,但每当我们处理计算实际数据时,这是意料之中的。这些变化应该很小并且仅限于卷积输出的低能量分量(即:边缘)。
考虑卷积操作的工作方式也很重要。X
卷积长度和长度的两组数据Y
将得到一个长度的答案X+Y-1
。对于像 MATLAB 和 Mathematica 这样的程序来说,有一些幕后的魔法可以给你一个长度X
或Y
.
所以关于@belisarius 的帖子,我们似乎真的在说同样的话。
从数值上看,结果并不相同,但图像看起来非常相似。
Mathematica 中的示例:
编辑
作为对@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}
*)