我有以下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比使用循环更快地使用向量和矩阵这一事实? 换句话说,这些代码如何矢量化?
答案 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
!