【问题标题】:Vectorizing disparityMap in Matlab在 Matlab 中矢量化视差图
【发布时间】:2014-11-08 13:17:37
【问题描述】:

我正在 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

【问题讨论】:

  • 我看不出这怎么能很容易矢量化,但是有一些明显的改进:arg1不依赖ij,所以它是常数,所以move it out of the loop !我猜你也可以在循环之前只旋转一次完整的im1,如果你稍微调整一下提取模板的索引。
  • 您也可以使用计算机视觉系统工具箱中的disparity函数。

标签: matlab computer-vision vectorization matlab-cvst


【解决方案1】:

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

  • 将 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,看看是否有改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    相关资源
    最近更新 更多