如何将弧延伸到一个完整的圆?

时间:2017-04-16 16:57:18

标签: python image algorithm

给出一个固定大小的二进制方阵,如下图所示。 预先假定阵列包含圆形或其一部分的图像。重要的是这个圆圈始终以图像为中心。

Example

如果可能的话,有必要找到一种有效的方法来补充圆弧。

我试图统计计算从中心到白点的平均距离并完成圆圈。它有效。我也尝试过霍夫变换来拟合椭圆并确定它的大小。但这两种方法都非常耗费资源。

1方法草图:

points = np.transpose(np.array(np.nonzero(array))).tolist() # array of one-value points
random.shuffle(points) 
points = np.array(points[:500]).astype('uint8') # take into account only 500 random points

distances = np.zeros(points.shape[0], dtype='int32') # array of distances from the centre of image (40, 40) to some point
for i in xrange(points.shape[0]):
    distances[i] = int(np.sqrt((points[i][0] - 40) ** 2 + (points[i][1] - 40) ** 2))

u, indices = np.unique(distances, return_inverse=True)
mean_dist = u[np.argmax(np.bincount(indices))] # most probable distance
# use this mean_dist in order to draw a complete circle

1 method result

2方法草图:

from skimage.transform import hough_ellipse

result = hough_ellipse(array, min_size=..., max_size=...)
result.sort(order='accumulator')
# ... extract the necessary info from result variable if it's not empty

有人可以提出另一种有效的解决方案吗?谢谢!

1 个答案:

答案 0 :(得分:0)

  

我试图统计计算从中心到白点的平均距离并完成圆圈。

这似乎是一个好的开始。给定n像素的图像,此算法为O(n),这已经非常有效。

如果您想要更快的实施,请尝试使用随机化:

从图像中取m个随机采样点,并使用它们计算白点的平均半径。然后使用此半径完成圆圈。

此算法将具有O(m),这意味着它对所有m < n更快。为m选择一个好的值可能会很棘手,因为你必须在运行时和输出质量之间做出妥协。