【发布时间】:2011-09-28 13:50:24
【问题描述】:
我有一个矩阵(图像)和有关圆圈内有趣部分的信息 (给定的中心坐标和半径)。我想剪掉所有的圈子 矩阵的一部分,以便为每个圆做更多的计算。或者至少我想要一个带有所有圆圈的位掩码。
我使用 Octave(但也可以使用 MATLAB,但由于许可证的原因会很困难),并且有以下脚本以及来自 stackoverflow 的一些提示。我有 20 个圆圈的信息,在我的 Core i5 上使用 Octave 大约需要 0.7 秒:
% image
dim_x = 1000;
dim_y = 1000;
A=rand(dim_x,dim_y);
% center positions and ...
c = [222 111; 878 112; 81 718; 89 112; 222 111; 878 112; 81 718; 89 112; 222 111; 878 112; 81 718; 89 112; 222 111; 878 112; 81 718; 89 112; 222 111; 878 112; 81 718; 89 112];
%... radii of the circles
r = [10 33 55 2 22 10 33 55 2 22 10 33 55 2 22 10 33 55 2 22];
tic;
for i=1:size(c,1)
% create a bitmask ...
mask = bsxfun(@plus, ((1:dim_y) - c(i,1)).^2, (transpose(1:dim_x) - c(i,2)).^2) < r(i)^2;
% ... cut the circles out of the image
B=A.*mask;
end;
toc;
你知道一个更高效的解决方案,因为我想要大约 600 个圈子。
提前致谢
【问题讨论】:
-
您可能需要考虑预先计算或至少将掩码缓存到一定大小。看起来有很多重复的
r值。因此,每次计算掩码时,计算圆形部分,然后将其存储在单元格数组或其他东西中,然后将其移动中心偏移量以实际应用它。当再次遇到相同的 r 时,只需从元胞数组中拉出掩码即可。
标签: performance matlab image-processing geometry octave