通过具体的例子说明矩阵一维和二维的相关运算、卷积运算究竟是怎么做的

在图像处理中,大量的算法中用到的运算其实都是相关运算和卷积运算。
所以,我们很有必要知道相关运算、卷积运算究竟是怎么做的。
本篇博文通过具体而简单的例子向大家说明相关运算、卷积运算究竟是怎么做的。

01-一维相关运算
下图显示了一维序列n与窗口序列w作相关运算的过程。


上图中,要进行两个序列的相关运算,先移动w使其锚点与序号n最左侧的点重合,如图中b所示。锚点通常取中心点,锚点的概念见我的另一篇博文 图像处理中的窗口、核算子、模板、结构、卷积核、高斯核、锚点究竟是什么东西? - 计算机视觉与图像处理原理笔记 - 昊虹AI笔记网 - 用心记录CV-AI技术
需要注意的是,此时,这两个序列之间有一些点未重叠,为处理该问题,需要对序列f的边界作扩展处理,这就是我在博文图像处理作窗口运算时边界的几种扩展方法(详解OpenCV中的参数borderType) - 计算机视觉与图像处理原理笔记 - 昊虹AI笔记网 - 用心记录CV-AI技术中提到的边界扩展问题。
在这里我们对序列n的边界作填充0的扩展,以保证在w通过n的整个过程中,始终存在对应的点,如图中c所示。
准备工作做好后,现在开始进行相关运算。
相关运算结果的第一个数是在图c所示位置上两个序列对应位置乘积的累加和,图中也计算出了结果为28。
接着将w向右移动一个位置并再次计算乘积的累加和,如图d所示,此时得到相关计算结果为38。
重复上述过程,直到图g,即可全部计算出所有的相关计算结果值。
最终的相关计算结果为:28 38 44 50 26
用Matlab代码验证如下:
  1. clc
  2. close all
  3. clear all
  4. n1 = [5 6 7 8 9];
  5. w1 = [1 2 3];
  6. result1 = imfilter(n1, w1, 'corr', 'same');
复制代码

运行结果如下:


可见,运行结果与我们手工计算的结果一致。

02-一维卷积运算
一维卷积运算与一维相关运算过程一样,只是在运算前将窗口序列w先旋转180度。
整个过程如下面所示,由于过程与一维相关运算过程基本一样,所以就不再赘述。


从上面的图来看,最终的卷积运算结果为:
16 34 40 46 42
用Matlab代码验证如下:
  1. clc
  2. close all
  3. clear all
  4. n1 = [5 6 7 8 9];
  5. w1 = [1 2 3];
  6. result1 = imfilter(n1, w1, 'conv', 'same');
复制代码

运行结果如下:


可见,运行结果与我们手工计算的结果一致。

03-二维相关运算
将一维相关运算中的序列变成二维序列,容易得到二维序列的相关运算。
设有二维序列N(x,y):


和窗口W(x,y):


现对N(x,y)作窗口为W(x,y)的二维相关运算,
并令W的中心点(2,2)为锚点。
则结果的第1行第1列的元素的值是下面这两个矩阵对应元素的乘积的和:



所以相关结果的第1行第1列的元素的值的计算式为:
010+011+012+013+114+215+016+417+518=202
其它相关结果同样的计算方法可算得。
比如第2行第3列是下面这两个矩阵对应元素的乘积的和:



所以相关结果的第2行第3列的元素的值的计算式为:
210+311+012+513+614+015+816+917+018=483
用MATLAB验证一下我们的手工计算结果,代码如下:
  1. clc
  2. close all
  3. clear all
  4. N = [1 2 3;4 5 6;7 8 9];
  5. W = [10 11 12;13 14 15;16 17 18];
  6. result1 = imfilter(N, W, 'corr', 'same');
复制代码

运行结果如下:


可见,运行结果与我们手工计算的结果一致。

04-二维卷积运算
二维卷积运算与二维相关运算基本一致,只是运算前将窗先旋转180度,再作相关运算,这样得到的结果就是二维卷积运算。
这里有个小技巧,一个二维矩阵旋转180度,实际上等效于把最后一行变成第1行,第1行变成最后一行,然后每一行再调个头。当然从镜像的角度来讲等效于先作一个水平镜像,再作一个垂直镜像。
这里我们直接用MATLAB代码验证上面这段叙述。
  1. clc
  2. close all
  3. clear all
  4. N = [1 2 3;4 5 6;7 8 9];
  5. W = [10 11 12;13 14 15;16 17 18];
  6. W_180 = [18 17 16;15 14 13;12 11 10]
  7. result1 = imfilter(N, W, 'conv', 'same');
  8. result2 = imfilter(N, W_180, 'corr', 'same');
复制代码

上面代码的运行结果如下:



从上面的运行结果可知,result1与result2的结果相同,说明我们的理解和叙述是正确的。

至此,大家应该很清楚的知道了一维相关运算、一维卷积运算、二维相关运算、二维卷积运算是怎样运算的了吧。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值