Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将椭圆拟合到图像数据集_Python_Numpy_Opencv_Scipy_Data Fitting - Fatal编程技术网

Python 将椭圆拟合到图像数据集

Python 将椭圆拟合到图像数据集,python,numpy,opencv,scipy,data-fitting,Python,Numpy,Opencv,Scipy,Data Fitting,我正在用摄像机信号工作。摄像机的典型信号通过以下方式模拟: import cairo import numpy import matplotlib.pyplot as plt data = numpy.zeros((352, 352), dtype = numpy.uint8) surface = cairo.ImageSurface.create_for_data( data, cairo.FORMAT_A8, 352, 352) cr =

我正在用摄像机信号工作。摄像机的典型信号通过以下方式模拟:

import cairo
import numpy
import matplotlib.pyplot as plt


data = numpy.zeros((352, 352), dtype = numpy.uint8)
surface = cairo.ImageSurface.create_for_data(
                        data, cairo.FORMAT_A8, 352, 352)

cr = cairo.Context(surface)
cr.scale(0.85, 1.15)
cr.arc(200, 150, 100, 0, 2. * numpy.pi)
cr.set_line_width(15)
cr.stroke()

plt.imshow(data, cmap = "gray", interpolation = "None")
plt.show()

从该图像数据集中,我需要获得以下参数:
x-中心
y-中心
半径
厚度
椭圆度
白色椭圆环的椭圆角度

获得这些参数的快速准确方法是什么

我多年来获得的代码片段如下:

import scipy.odr

def gauss_2D(p, r):
  # p = [amplitude, x-cen, y-cen, x-waist, y-waist, angle_in_rad, z-offset]
  x = r[0,]
  y = r[1,]

  dx, dy = (x - p[1]), (y - p[2])

  xp = dx * numpy.cos(p[5]) + dy * numpy.sin(p[5])  
  yp = dy * numpy.cos(p[5]) - dx * numpy.sin(p[5])

  data = (p[0] * numpy.exp(-2 * (xp / p[3])**2 - 2 * (yp / p[4])**2)) 

  return data + p[6]

def fit_gauss(p_guess, data_set):
  rr = numpy.indices(data_set.shape[:2])
  N = rr.shape[1] * rr.shape[2]

  fix = [1, 1, 1, 1, 1, 1, 1]

  model = scipy.odr.Model(gauss_2D)
  data = scipy.odr.Data(rr.reshape((2, N)), data_set.reshape((1, N)))
  odr = scipy.odr.ODR(data, model, p_guess, ifixb = fix)
  odr.set_job(fit_type = 2)
  output = odr.run()

  coeff = output.beta
  coeff_sd = output.sd_beta

  return rr, coeff, coeff_sd 
但是,我无法将
gauss_2D
重写为一个函数,该函数适用于具有特定线宽的椭圆


感谢您的帮助

如果在外边缘和内边缘进行单独装配,会怎么样?像
findContours
一样,然后将每个轮廓渲染为一个薄多边形(甚至可能是填充多边形),对其进行拟合。从中计算厚度。