2D-Faltung durch 1D-Faltung unter Verwendung trennbarer Eigenschaften

Ich schreibe ein Programm, in dem ich viel 2D-Faltung mache. Also dachte ich, dass ein effizienterer Ansatz die Verwendung von 1D-Faltung sein könnte. Aber ich scheine daran festzuhalten.

Bisher habe ich auf diese Links verwiesen:

überprüfe dies 1)http://blogs.mathworks.com/steve/2006/10/04/separable-convolution/

überprüfe dies 2)http://blogs.mathworks.com/steve/2006/11/28/separable-convolution-part-2/

Ich habe einen Gaußschen Kern (K) der Größe 5X5. Ich muss diese Kernelfunktion mit dem Bild falten. Meine Bildgröße muss 4000X4000 sein. Ich gebe das Programm unten:

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

Ich habe den Rang der Matrix K überprüft. Es kommt 1, also ist es in der Tat ein trennbarer Vektor, der als äußeres Produkt von zwei 1 D-Vektoren ausgedrückt werden kann. Die 1 D-Vektoren werden hier als K1 & K2 bezeichnet. Ich habe es dann zeitlich festgelegt, um ein Gefühl dafür zu bekommen, welche Methode schneller ist? Die Ergebnisse sind unten gezeigt:

%//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.

Wie ihr sehen könnt, ist die erste Methode die schnellste, während die dritte Methode auch ziemlich schnell ist. Die dritte und zweite Methode weisen ebenfalls einen sehr geringen Fehler in der Größenordnung von e-14 auf, aber beide Methoden sind im Vergleich zur ersten Methode mit conv2 extrem langsam.

Kannst du mir sagen, warum die Methode mit der 1D-Faltung am langsamsten ist?

Vielen Dank im Voraus an euch alle !!

Edit: Bitte siehe meine 4. Methode !!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage