這四個嵌套循環基本上是以滑動鄰域風格處理圖像中的每個像素。我立即想到了NLFILTER和IM2COL的功能。
這是我嘗試向量化代碼。請注意,我還沒有徹底測試,或者對相比基於循環解決方案的性能:
function WD = wigner(D, Md, Nd, lambda)
%# window size and lambda
if nargin<2, Md = 5; end
if nargin<3, Nd = 5; end
if nargin<4, lambda = 5; end
%# image size
[M,N,~] = size(D);
%# kernel = exp(-lambda*norm([k,l])
[K,L] = meshgrid(-floor(Md/2):floor(Md/2), -floor(Nd/2):floor(Nd/2));
K = K(:); L = L(:);
kernel = exp(-lambda .* sqrt(K.^2+L.^2));
%# frequency-domain part
F = fft2(D);
%# f(x+k,y+l) * f(x-k,y-l) * kernel
C = im2col(D, [Md Nd], 'sliding');
X1 = bsxfun(@times, C .* flipud(C), kernel);
%# cos(theta)
C = im2col(F, [Md Nd], 'sliding');
C = C(round(Md*Nd/2),:); %# take center pixels
theta = bsxfun(@times, real(C), K/M) + bsxfun(@times, imag(C), L/N);
X2 = cos(4*pi*theta);
%# combine both parts for each sliding-neighborhood
WD = col2im(sum(X1.*X2,1), [Md Nd], size(F), 'sliding') .* (4/(M*N));
%# pad array with zeros to be of same size as input image
WD = padarray(WD, ([Md Nd]-1)./2, 0, 'both');
end
爲了什麼它的價值,這裏是基於循環的版本與提升上,建議@Laurbert515:
function WD = wigner_loop(D, Md, Nd, lambda)
%# window size and lambda
if nargin<2, Md = 5; end
if nargin<3, Nd = 5; end
if nargin<4, lambda = 5; end
%# image size
[M,N,~] = size(D);
%# frequency-domain part
F = fft2(D);
WD = zeros([M,N]);
for l = -floor(Nd/2):floor(Nd/2)
for k = -floor(Md/2):floor(Md/2)
%# kernel = exp(-lambda*norm([k,l])
kernel = exp(-lambda * norm([k,l]));
for x = (1+floor(Md/2)):(M-floor(Md/2))
for y = (1+floor(Nd/2)):(N-floor(Nd/2))
%# cos(theta)
theta = 4 * pi * (real(F(x,y))*k/M + imag(F(x,y))*l/N);
%# f(x+k,y+l) * f(x-k,y-l)* kernel
WD(x,y) = WD(x,y) + (cos(theta) * D(x+k,y+l) * D(x-k,y-l) * kernel);
end
end
end
end
WD = WD * (4/(M*N));
end
我怎麼測試(基於我從
paper你
previously掛理解)
:
%# difference between two consecutive frames
A = imread('AT3_1m4_02.tif');
B = imread('AT3_1m4_03.tif');
D = imsubtract(A,B);
%#D = rgb2gray(D);
D = im2double(D);
%# apply Wigner-Distribution
tic, WD1 = wigner(D); toc
tic, WD2 = wigner_loop(D); toc
figure(1), imshow(WD1,[])
figure(2), imshow(WD2,[])
,那麼你可能需要對矩陣進行縮放/歸一化,並應用閾值...
我想你會看到'M'和'N'大值的改進。他們多大? –
我可以告訴你矢量化肯定會提高計算速度。當MATLAB做矢量數學運算時,它會一直下到你的PC的[BLAS](http://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms)進行優化。 – kevlar1818
@EitanT圖片尺寸爲320(N)x 240(M)。 – Absi