代碼
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 度再做濾波,這里核的位置在前面,需要尤其注意。