向量化 MATLAB 循环

Vectorize MATLAB loop

我有以下 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 使用 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 的理由!