我有一个与您非常相似的问题,试图在 CT 和 MR 图像中居中圆形物体 - 并通过配准、霍夫变换等走各种路线。所有这些都有效,但缓慢而复杂,而且不是非常强大。
通过退后一步并以不同的方式思考,我最终使用了一种更简单、更强大、更快的方法。
您在图像中有两个圆圈,并且您想要找到位置和比例。
- 因此,首先获取图像的两个 1D 配置文件 - 一个在行中,一个在列中。您的对象是一个圆圈,因此将产生两个类似高斯的一维轮廓。这是简单的平均数组切片,所以非常快:
# r/c 1/0 are variables you can use to set limits on which areas of
# the image you want to limit the search to, or you can use the entire
# image size
r0 = c0 = 0
r1, c1 = image.shape
r_prof = np.mean(image[r0:r1, :], axis=0)
c_prof = np.mean(image[:, c0:c1], axis=1)
- 找到这些高斯轮廓的中心点。这对于任何峰值查找算法都很容易。这给了你你的圈子的中心。
# find_peak is a function to find the peak index in a profile
circle_r = find_peak(r_profile)
circle_c = find_peak(c_profile)
- 要找到比例,您需要找到圆圈的大小。要做到这一点,只需重新制作图像配置文件,但这次将行/列缩小到您上方圆圈中心的单个像素。这会给你一个非常方形的轮廓。
# get single pixel width profile across center of circle
r_prof = np.mean(image[circle_r, :], axis=0)
c_prof = np.mean(image[:, circle_c], axis=1)
- 从方形轮廓很容易计算边缘,两条边缘位置之间的差异为您提供直径。
因此,您最终得到圆的中心和直径。
我使用这种方法来做你正在做的事情——圆形轮廓的位置和大小——在 CT 和 MR 中。它最终比其他任何东西都快了至少一个数量级,而且更加强大。