MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   filter2函数中滤波器矩阵旋转的物理意义 (https://www.labfans.com/bbs/showthread.php?t=24250)

poster 2019-12-10 20:48

filter2函数中滤波器矩阵旋转的物理意义
 
在使用MATLAB 2D滤波器函数filter2(B,X)和卷积函数conv(X,B,'') ,我看到filter2函数本质上是2D卷积,但旋转了滤波器系数矩阵180度。在filter2和conv2的输出conv2 ,我看到以下关系成立:

output matrix of filter2 = each element negated of output of conv2 [B]编辑:我不正确;上述关系通常并不成立,但在少数情况下我看到了。通常,两个输出矩阵是不相关的,这是因为在两个输出矩阵中都获得了2个完全不同的内核,这些内核用于卷积。[/B]

我了解2D卷积的执行方式。我想了解的是图像处理方面的含义。我如何可视化这里发生的事情?将滤波器系数矩阵旋转180度是什么意思?



[B]回答:[/B]

我将从Wikipedia的以下图像开始,对[URL="http://en.wikipedia.org/wiki/Convolution"]卷积[/URL]进行非常简短的讨论:

[IMG]https://i.stack.imgur.com/SbAEE.png[/IMG]

如图所示,对两个一维函数进行卷积涉及到反映其中一个(即卷积内核),将两个函数彼此滑动,并计算其乘积的积分。

在对二维矩阵进行卷积时,卷积核会[I]在两个维度上均[/I]得到反映,然后针对与另一个矩阵的每个唯一重叠组合计算乘积之和。内核尺寸的这种反映是卷积的固有步骤。

但是,在执行过滤时,我们希望将过滤矩阵看作是“模板”,直接[I]按原样[/I]放置(即没有反射)在要过滤的矩阵上。换句话说,我们希望执行与卷积等效的运算,但不反映滤波矩阵的维数。为了消除在卷积期间执行的反射,因此我们可以在执行卷积之前添加滤波器矩阵尺寸的附加反射。

现在,对于任何给定的二维矩阵A ,您可以使用MATLAB中的[URL="http://www.mathworks.com/help/techdoc/ref/flipdim.html"]FLIPDIM[/URL]和[URL="http://www.mathworks.com/help/techdoc/ref/rot90.html"]ROT90[/URL]函数证明自己翻转两个维度等效于将矩阵旋转180度:

A = rand(5); %# A 5-by-5 matrix of random values isequal(flipdim(flipdim(A,1),2),rot90(A,2)) %# Will return 1 (ie true) 这就是为什么filter2(f,A)等同于conv2(A,rot90(f,2),'same') 。为了进一步说明对滤波器矩阵和卷积核有何不同的认识,我们可以看看将[URL="http://www.mathworks.com/help/techdoc/ref/filter2.html"]FILTER2[/URL]和[URL="http://www.mathworks.com/help/techdoc/ref/conv2.html"]CONV2[/URL]应用于同一组矩阵f和A时会发生什么,定义如下:

>> f = [1 0 0; 0 1 0; 1 0 0] %# A 3-by-3 filter/kernel f = 1 0 0 0 1 0 1 0 0 >> A = magic(5) %# A 5-by-5 matrix A = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 现在,当执行B = filter2(f,A);输出元素B(2,2)的计算可以通过将滤波器的中心元素与A(2,2)并乘以重叠元素来可视化:

17*1 24*0 1*0 8 15 23*0 5*1 7*0 14 16 4*1 6*0 13*0 20 22 10 12 19 21 3 11 18 25 2 9 由于忽略了滤波器矩阵外部的元素,因此可以看到乘积之和为17*1 + 4*1 + 5*1 = 26 。请注意,这里我们只是将f像“模板”一样放在A顶部,这就是将滤波器矩阵感知为对矩阵进行操作的方式。

当我们执行B = conv2(A,f,'same'); ,输出元素B(2,2)的计算看起来像这样:

17*0 24*0 1*1 8 15 23*0 5*1 7*0 14 16 4*0 6*0 13*1 20 22 10 12 19 21 3 11 18 25 2 9 而乘积的总和将改为5*1 + 1*1 + 13*1 = 19 。请注意,当f被视为卷积核时,我们必须先翻转其尺寸,然后再将其放置在A之上。



[url=https://stackoverflow.com/questions/4510624]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 01:06

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.