gpt4 book ai didi

python - 拟合两个重叠圆的图像

转载 作者:太空宇宙 更新时间:2023-11-03 15:52:18 25 4
gpt4 key购买 nike

我正在尝试拟合两个重叠圆圈的二维图像,其中一个圆圈完全由 1 组成,另一个圆圈完全由 0 组成。下面是一个最小的工作示例。

curve_fit似乎根本没有做任何拟合,只是返回初始猜测。我一开始只是尝试为其中一个圆拟合一个参数,但最终,我想拟合所有参数:两个圆心的位置和每个圆的半径。

任何帮助将不胜感激。谢谢。

%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt

from scipy.optimize import curve_fit

def overlapping_circles((x, y), x0, y0, r0, x1, y1, r1):
img = np.zeros_like(x)

img[np.sqrt((x - x0)**2 + (y - y0)**2) <= r0] = 1.
img[np.sqrt((x - x1)**2 + (y - y1)**2) <= r1] = 0.

return img.ravel()

size = 100.
# Create x and y indices
x = np.linspace(0, size-1, size)
y = np.linspace(0, size-1, size)
x, y = np.meshgrid(x, y)
x0, y0 = size/2., size/2.
r0 = 30.
x1, y1 = size/2., size/4.
r1 = 30.
img = overlapping_circles((x, y), x0, y0, r0, x1, y1, r1)
plt.imshow(img.reshape(size, size), interpolation='none')

popt, pcov = curve_fit(lambda (x,y), guess_x0: overlapping_circles((x,y), guess_x0, y0, r0, x1, y1, r1), (x, y), img, p0=x0/2.)
print(popt, x0/2.)

重叠的圆圈:

Overlapping circles

<小时/>

感谢 lucianopaz 提供了可行的解决方案。我已经粘贴了实现下面使用暴力的建议的代码,以供后代使用。

%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt

from scipy.optimize import brute

def overlapping_circles((x, y), x0, y0, r0, x1, y1, r1):
img = np.zeros_like(x)

img[np.sqrt((x - x0)**2 + (y - y0)**2) <= r0] = 1.
img[np.sqrt((x - x1)**2 + (y - y1)**2) <= r1] = 0.

return img.ravel()

def residuals((x, y), x0, y0, r0, x1, y1, r1, img):
return np.sum((overlapping_circles((x, y), x0, y0, r0, x1, y1, r1) - img.ravel())**2.)

size = 100.
# Create x and y indices
x = np.linspace(0, size-1, size)
y = np.linspace(0, size-1, size)
x, y = np.meshgrid(x, y)
x0, y0 = size/2., size/2.
r0 = 30.
x1, y1 = size/2., size/4.
r1 = 30.
img = overlapping_circles((x, y), x0, y0, r0, x1, y1, r1)
plt.imshow(img.reshape(size, size), interpolation='none')

simplified_residuals = lambda fit_x0: residuals((x, y), fit_x0[0], fit_x0[1], r0, x1, y1, r1, img)

rranges = (slice(0, 100, 1), slice(0, 100, 1))
resbrute = brute(simplified_residuals, rranges, full_output=True, finish=None)
print(resbrute[0], x0, y0)

最佳答案

您的curve_fit实现是正确的,唯一的小评论是我认为xy应该被拆开并放置放入数组中,因为 docs假设自变量应该是:

An M-length sequence or an (k,M)-shaped array for functions with k predictors. The independent variable where the data is measured.

但是,我相信您的问题不在于那里,而是因为函数 overlapping_circles 条件不佳而发生。它是不可微的,因为由于img的像素离散化,参数的微小变化可能导致img没有变化。为了改善拟合,您应该使用不使用最小化函数的雅可比矩阵或粗麻布矩阵的方法,并且该方法适用于条件较差的不可微分问题。推荐你看看here , herehere 。当然,对于您的问题,仅使用 brute force 可能会有用。方法来粗略估计参数。

关于python - 拟合两个重叠圆的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41177249/

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