我正在Matlab中实现基于平方距离之和的视差图功能,以实现计算机视觉。当前,该代码具有嵌套的for循环,并且运行速度非常慢。关于对其向量化以使其更有效的任何建议?谢谢
%im1 and im2 are images and win1, win2 are window sizes
for i=win1+1:1:bottom-win1
parfor j=win2+1:1:right-win2
%j=[win2+1:bottom-win2];
template=im1(i-win1:i+win1,j-win2:j+win2);
arg1=conv2(im2.^2,ones(size(template))/2,'same');
arg2=conv2(im2,rot90(template,2),'same');
arg=arg1-arg2;
[xj]=find(arg==min(arg(:)));
disparityMap(i,j)=1-xj(1);
end
end
尝试加快速度的三个建议:
im2.^2
在循环之前进行一次计算,并将其值保存在一个临时变量中,因为它不依赖于循环变量,因此无需一次又一次地进行计算,实际上arg1
移出循环,因为它仅取决于的大小,template
而不取决于其值,并且如果我看正确的话,大小是恒定的;[xj]=find(arg==min(arg(:)));
用类似于的方式替换该构造,[tmp, ind] = min(arg(:)) ; xj=ind2sub(size(arg), ind)
以避免调用find
并重新扫描矩阵,同时可以轻松地计算索引。未经测试,但应该可以让您开始
arg1=conv2(im2.^2,ones([2*win1+1, 2*win2+1])/2,'same');
parfor i=win1+1:1:bottom-win1
for j=win2+1:1:right-win2
%j=[win2+1:bottom-win2];
template=im1(i-win1:i+win1,j-win2:j+win2);
arg2=conv2(im2,rot90(template,2),'same');
arg=arg1-arg2;
[tmp, ind] = min(arg(:)) ;
xj=ind2sub(size(arg), ind);
disparityMap(i,j)=1-xj(1);
end
end
还要确保选择了适当的工作人员数量,然后尝试将代码编译为mex以查看是否有改进。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句