我有一个600x600整数值的数组。 值代表一个圆圈。 例如:0在外面,> = 1在圆圈内。 这是一个简短的例子:
0000110000000
0001111000000
0011111200000
0112112110000
1111111111000
0111411110000
0011131100000
0000110000000
0000000000000
0000000000000
阵列中圆的位置和大小不同。 现在,我正在寻找一种快速算法来找到圆的中心和半径。 快,因为我必须处理许多数组。
答案 0 :(得分:1)
叠加网格,走它,(小矩阵:每行和每列,每第X行和列的大矩阵)并找到发生变化(0 - >> = 1或反之亦然)的点。
如果您的网格是对称且足够密集的,则这些点的平均值等于中心。
找到的点和中心的平均距离(sqrt(x-xm)+ sqr(y-ym)))是半径的度量。
单独行走行可能足以用于较大的数据集,并且仅扫描第X行。如果使用真实图像,则可能需要考虑噪声和亮度变化。
答案 1 :(得分:0)
可以更快地完成。实际上根据你的样本,如果有一个圆圈或一个正方形,那么无关紧要(我们不能估计)。
假设存在一个基于0的二维数组,则半径将只是非零(非空)行(或列)除以2的计数。
<强> ALGO。强>
查找非零行的数量及其第一个(顶部)索引。
将此数字除以2并添加零行数,索引小于最小的非零行。现在您知道了radius
和y
坐标。
找到第一个(左)非零列并将半径添加到其索引中。现在您拥有x
坐标。
在提供的示例中。
radius
是8/2 = 4.在非零行之前有0行到顶部(换句话说,第一个非行的ID)零行是0)。所以y
坐标是0 + 4 = 4. x
坐标为4 + 0 = 4。要知道列是否为零,您可以使用以下函数:
IsEmpty := true;
for i := 0 to High(Column) do
if Column[i] > 0 then
begin
IsEmpty := false;
Break;
end;