矢量化MATLAB循环

时间:2015-04-27 19:46:19

标签: performance matlab image-processing vectorization

我有以下MATLAB代码:

meanv = [rmean,gmean,bmean];
for i = 1:1:image_info.Height
    for j = 1:1:image_info.Width      % for every pixel
        x = image_rgb(i,j,1:3);
        pix_color = [x(:,:,1),x(:,:,2),x(:,:,3)];
        d = dist(meanv,pix_color');
        if d <= threshold
            S(i,j) = 1;
        end
    end
end

上述片段是程序的一部分,该程序从RGB图像中分割出来自用户标记的几个点的对象或颜色。通过欧氏距离与用户标记的点的平均值来实现分割。对于每个像素,如果距离小于给定阈值,则该像素在分割图像中是白色的。否则,黑色。

代码效果很好,但速度有点慢。我如何利用MATLAB比使用循环更快地使用向量和矩阵这一事实? 换句话说,这些代码如何矢量化

1 个答案:

答案 0 :(得分:4)

方法#1 使用bsxfun -

%// Get image size
[m,n,r] = size(image_rgb)

%// Calculate squared distances 
M = sum(bsxfun(@minus,reshape(image_rgb,[],3),meanv).^2,2)

%// Check if sq-ed distance satisfy threshold criteria & reshape back to img size
S = reshape(M <= threshold^2 ,m,n)

方法#2 使用matrix-multiplication based euclidean distance calculations -

%// Get image size
[m,n,r] = size(image_rgb)

%// Calculate squared distances 
A = reshape(image_rgb,[],3);
Bt = meanv(:);
M = [A.^2 ones(size(A)) -2*A ]*[ones(size(Bt)) ; Bt.^2 ; Bt]

%// Check if sq-ed distance satisfy threshold criteria & reshape back to img size
S = reshape(M<= threshold^2,m,n)

快速运行时测试:在随机512 x 512 x 3图片上运行代码:image_rgb = randi(255,512,512,3),运行时间为 -

---------------------------------- With Original Approach
Elapsed time is 5.850163 seconds.
---------------------------------- With BSXFUN
Elapsed time is 0.006737 seconds.
-------------------------- With Matrix-multiplication based Eucl. dist
Elapsed time is 0.015704 seconds.

更多理由选择vectorization