Matlab 图像处理中卷积的几种实现?

代码

clear;close all;clc

img1 = rand(5,5); % 输入图像
img2 = rand(5,5); % 核

% 卷积的几种实现方式
a = conv2(img1,img2,\'same\');
b = imfilter(img1,rot90(img2,2));
c = imfilter(img1,img2,\'conv\');
d = filter2(rot90(img2,2),img1);

% 对比
cmp = [a(:),b(:),c(:),d(:)];

总结

观察 cmp 矩阵后发现三者数值一样,但通过计算误差发现,仍然存在极小的误差,这与函数的实现原理有关,因此可以近似地认为以上三种方法能够获得一样的卷积效果。

  • 使用 conv2(A,B) 实现卷积,A 为图像,B 为核。
  • 使用 imfilter(A,rot90(B)) 实现卷积,A 为图像,B 为核。因为该函数主要功能是实现滤波的,即直接对应位置元素加权求和,但卷积需要翻转 180 度,故使用 rot90(),逆时针翻转 2 个 90 度,再滤波即为卷积。或者直接指定其滤波类型为卷积,即 imfilter(A,B,\'conv\'), A 为图像,B 为核。
  • 使用 filter2(rot90(B),A) 实现卷积,A 为图像,B 为核。filter2 是 imfilter2 的单通道形式,即只能处理单通道滤波,故同样先翻转 180 度再做滤波,这里核的位置在前面,需要尤其注意。