gpt4 book ai didi

python - 将圆圈拟合到二值图像

转载 作者:太空狗 更新时间:2023-10-29 22:09:17 25 4
gpt4 key购买 nike

我一直在使用 skim age 的阈值算法来获得一些二进制掩码。例如,我获取这样的二进制图像:

Binary image obtained as a result of Otsu thresholding

我想弄清楚的是如何将一个圆圈拟合到这个二进制掩码上。约束是圆圈应覆盖尽可能多的白色区域,并且圆圈的整个圆周应完全位于白色部分上。

我一直在绞尽脑汁思考如何才能有效地做到这一点,但没有想出有效的解决方案。

我认为可能有用的一种方法是:

  • 找到图像/圆的最佳中心(我还不确定该怎么做。也许是一些类似光栅扫描的方法)。
  • 计算增加半径的圆,并计算出它何时开始离开白色区域或图像之外。
  • 然后质心和半径将描述圆。

最佳答案

这是一个尝试通过最小化来实现最佳圆拟合的解决方案。很快就会发现气泡不是圆形 :) 请注意使用“regionprops”来轻松确定区域的面积、质心等。

Circle fit to bubble

from skimage import io, color, measure, draw, img_as_bool
import numpy as np
from scipy import optimize
import matplotlib.pyplot as plt


image = img_as_bool(io.imread('bubble.jpg')[..., 0])
regions = measure.regionprops(measure.label(image))
bubble = regions[0]

y0, x0 = bubble.centroid
r = bubble.major_axis_length / 2.

def cost(params):
x0, y0, r = params
coords = draw.disk((y0, x0), r, shape=image.shape)
template = np.zeros_like(image)
template[coords] = 1
return -np.sum(template == image)

x0, y0, r = optimize.fmin(cost, (x0, y0, r))

import matplotlib.pyplot as plt

f, ax = plt.subplots()
circle = plt.Circle((x0, y0), r)
ax.imshow(image, cmap='gray', interpolation='nearest')
ax.add_artist(circle)
plt.show()

关于python - 将圆圈拟合到二值图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28281742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com