试验很简单,取二值图像的质心,三种方法做比较
1.完全采用矩阵性能不做任何循环操作,对find后的值进行除法与取余操作,从而得到centroid
2.完全采用循环操作,最简单明了
3.结合1,2,对每一列进行find,省去与除法与取余的计算时间
分析
试验证明
-
矩阵小的情况下,2是最优的,1与3差不多是2的三倍
-
矩阵中大情况下,三种方法时间一样
-
当处理大矩阵时,方法3具有明显的优势,1,2差不多是3的两倍倍时间
所以我采用了方法2,简单明了,效率也可以。
测试代码
M = 9000;
N = 1700;
A = randn(M,N);
A = A>0.0;
%%%%%%%%%%%%%%%%%%%% 方法1 %%%%%%%%%%%
fprintf('
1: ');
tic
b = find(A>0);
c = mod(b,M);
x1 = sum(c)+numel(find(c==0))*M;
y1 = sum(ceil(b./double(M)));
n1 = numel(b);
toc
%%%%%%%%%%%%%%%%%%%% 方法2 %%%%%%%%%%%
fprintf('2: ');
tic
sx = 0;
sy = 0;
n2 = 0;
for i = 1:M
for j = 1:N
if A(i,j) > 0
sx = sx + i;
sy = sy + j;
n2 = n2 + 1;
end
end
end
x2 = sx;
y2 = sy;
toc
%%%%%%%%%%%%%%%%%%%% 方法3 %%%%%%%%%%%
fprintf('3: ');
tic
sx = 0;
sy = 0;
for j = 1:N
c = find(A(:,j)>0);
sy = sy + numel(c)*j;
sx = sx + sum(c);
end
x3 = sx;
y3 = sy;
toc
fprintf('(%d,%d,%d),(%d,%d,%d),(%d,%d)
',x1,y1,n1,x2,y2,n2,x3,y3);