所以我这样写:
function y = convolution(u,v)
[m,n] = size(u);
[w,z] = size(v);
y = zeros(m-w+1,n-z+1);
for i = 1:m-w+1
for j = 1:n-z+1
y(i,j) = sum(sum(u(i:i+w-1,j:j+z-1).*v));
end
end
end
然后,我将其与matlab中的conv2()进行了比较:
function timedConv
a = im2double(rgb2gray(imread('picture.png')));
tic
convolution(a,[4 5 6;0 0 0;3 2 1]);
toc
tic
conv2(a,[4 5 6; 0 0 0; 3 2 1]);
toc
end
并发现我的代码需要4秒钟才能运行,而matlab的conv2大约需要0.01秒。而且,我的输出是m-w + 1 x n-z + 1矩阵,而matlab的输出是m + w-1 x n + z-1,因此假设图像外的零行和列进行卷积在图像的边缘。当我显示结果时,它们看起来相同,因此我的功能必须正常工作。它太慢了,我不知道为什么。我能以某种方式摆脱for循环吗?
Matlab使用FFT来进行卷积Conv = FFTinv(FFT(Image) x FFT(Kernel))
,这比经典的卷积要快得多。更具体地说,Matlab调用C ++库来执行FFT,这比Matlab快几十倍。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句