【问题标题】:2D convolution by 1D convolution using separable properties使用可分离属性的 1D 卷积进行 2D 卷积
【发布时间】:2013-09-02 19:38:00
【问题描述】:

我正在编写一个程序,我在其中进行了大量的 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 的第一种方法相比,这两种方法都非常慢。

你们能告诉我为什么涉及一维卷积的方法最慢吗?

提前感谢大家!!

编辑:请看我的第四个方法!!

【问题讨论】:

  • 第四种方法是什么?你有什么文件可以参考吗?谢谢

标签: matlab image-processing convolution


【解决方案1】:

第二种方法的结果不是KI1*KI2,而是KI2。请注意,KI2 已经被卷积了两次。如果你用第二种方法计算KI- KI2,你会得到一个小错误。

至于速度,我有这些cmets:

  • 第二种方法中的KI - KI2 行和第三种方法中的KI - KI3 行会减慢速度,不应将其包括在比较中。只需删除它们。
  • 在方法二中,重用变量KI1,而不是定义一个新的KI2:即用KI1 = imfilter(KI1,K2,'conv');替换KI2 = imfilter(KI1,K2,'conv');。这可能会减少花在内存分配上的时间。
  • 您的Img 矩阵非常小。对于较大的矩阵,第二种方法最快。

使用 4000 乘以 4000 Img 矩阵,并应用其他更改,我分别得到:

Elapsed time is 4.924468 seconds.
Elapsed time is 0.793251 seconds.
Elapsed time is 0.854416 seconds.

【讨论】:

  • 谢谢我更新了这个问题。那是我的一个错误。但是你能告诉我为什么一维卷积的结果是所有三种方法中最慢的吗?还是我做错了什么?
  • 我已经更新了答案。您错误地更新了第二种方法中的行
  • 感谢您的回答
  • 能否请您发布代码sn-p?我没有得到想要的结果。我正在更新一组新的代码行以反映您在上面所说的更改,而且我的第一种方法仍然更快。请务必发布您的代码。这将非常有帮助。
  • 在您应用我建议的更改后,我的代码就像您当前的代码一样。我已经尝试了第四种方法。大Img 它比第二和第三慢。对于小的Img,它的计算时间是第一个,它们都是(大约)最快的
猜你喜欢
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 2019-06-09
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多