在Matlab中向量化DisparityMap

尼基尔·奈纳尼(Nikhil Nainani)

我正在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
达米安·弗朗索瓦

尝试加快速度的三个建议:

  • 将parfor移至外循环以减少并行构造的开销;
  • 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章