我正在编写一个程序,我在其中进行了大量的 2D 卷积。所以我认为更有效的方法可能是使用一维卷积。但我似乎坚持这一点。
到目前为止,我已经提到了这个链接:
检查这个 1) http://blogs.mathworks.com/steve/2006/10/04/separable-convolution/
检查这个 2) http://blogs.mathworks.com/steve/2006/11/28/separable-convolution-part-2/
我有一个大小为 5X5 的高斯核(K)。我需要将此核函数与图像进行卷积。我的图像尺寸强制为 4000X4000。我在下面给出程序:
clc;clear all;close all;
imgID = 5;
Img = imread([num2str(imgID),'.bmp']);
Img = double(Img(:,:,1));
Img = imresize(Img,[4000 4000]);
sigma=3.0;
K=fspecial('gaussian',round(2*sigma)*2+1,sigma); % the Gaussian kernel
%%
%//Trying to use 1D convolution instead of using 2D convolution
[U,S,V] = svd(K);
K1 = U(:,1) * sqrt(S(1,1));
K2 = V(:,1)' * sqrt(S(1,1));
%%
tic
KI=conv2(Img,K,'same');
toc
tic
KI1 = imfilter(Img,K1,'conv');
KI1 = imfilter(KI1,K2,'conv');
toc
tic
KI2 = imfilter(Img,K,'conv');
toc
tic
KI3 = conv2(K1,K2,Img,'same');
toc
我检查了矩阵 K 的秩。它确实是 1,所以它确实是一个可分离的向量,可以表示为两个一维向量的外积。这里的一维向量称为 K1 和 K2。然后我对其进行计时以了解哪种方法更快?结果如下所示 :
%//1st method
Elapsed time is 0.375002 seconds.
%//2nd method
Elapsed time is 1.601285 seconds.
%//3rd method
Elapsed time is 1.884165 seconds.
%//4th method
Elapsed time is 0.315134 seconds.
如你们所见,第一种方法最快,而第三种方法也很快。第三种和第二种方法的误差也非常低,大约为 e-14,但与使用 conv2 的第一种方法相比,这两种方法都非常慢。
你们能告诉我为什么涉及一维卷积的方法最慢吗?
提前感谢你们所有人!
编辑:请看我的第四种方法!!