[SciPy-user] Fitting sphere to 3d data points
jjv5 at nih.gov
Thu Jan 25 09:53:56 CST 2007
Thanks for all the input. I think I've got it. This works:
""" residuals from sphere fit """
a,b,c,r = p # a,b,c are center x,y,c
coords to be fit, r is the radius to be fit
distance = sqrt( (x-a)**2 + (y-b)**2 + (z-c)**2 )
err = distance - r # err is distance from input
point to current fitted surface
params = [0.,0.,0.,0.]
myResult = leastsq(resSphere, params, args=(myX,myY,myZ) )
On Jan 25, 2007, at 10:47 AM, David Douard wrote:
> On Thu, Jan 25, 2007 at 09:31:10AM -0500, David Huard wrote:
>> Hi James,
>> As a first guess, I'd say the center of the sphere is simply the
>> mean of
>> your data points, if they're all weighted equally.
> I would have rather said that you need to find the point that minimize
> the distance to the normals of the triangles you have from your data
> points (not sure this is really meaningful...).
> If the points really are on a sphere, all the normal will cut on one
> point. If not, there really is a minimization problema to solve.
>> With only one parameter
>> left to fit, it should be easy enough. However, you may want to
>> look at the
>> Werman, Michael and Keren, Daniel
>> A Bayesian method for fitting parametric and nonparametric models
>> to noisy
>> Ieee Transactions on Pattern Analysis and Machine Intelligence,
>> 23, 2001.
>> They write that the Mean Square Error approach overestimates the
>> radius in
>> the case of circles. They don't talk about the 3D case, but I'd guess
>> similar problems arise. They provide a method to fit parametric
>> shapes with
>> some robustness to data errors.
>> 2007/1/25, James Vincent <jjv5 at nih.gov>:
>>> Is it possible to fit a sphere to 3D data points using
>>> scipy.optimize.leastsq? I'd like to minimize the residual for the
>>> from the actual x,y,z point and the fitted sphere surface. I can
>>> see how to
>>> minimize for z, but that's not really what I'm looking for. Is
>>> there a
>>> better way to do this? Thanks for any help.
>>> params = a,b,c and r
>>> a,b,c are the fitted center point of the sphere, r is the radius
>>> err = distance-to-center - radius
>>> err = sqrt( x-a)**2 + (y-b)**2 + (z-c)**2) - r
>>> James J. Vincent, Ph.D.
>>> National Cancer Institute
>>> National Institutes of Health
>>> Laboratory of Molecular Biology
>>> Building 37, Room 5120
>>> 37 Convent Drive, MSC 4264
>>> Bethesda, MD 20892 USA
>>> jjv5 at nih.gov
>>> SciPy-user mailing list
>>> SciPy-user at scipy.org
>> SciPy-user mailing list
>> SciPy-user at scipy.org
> David Douard LOGILAB, Paris (France)
> Formations Python, Zope, Plone, Debian : http://www.logilab.fr/
> Développement logiciel sur mesure : http://www.logilab.fr/
> Informatique scientifique : http://www.logilab.fr/science
> SciPy-user mailing list
> SciPy-user at scipy.org
James J. Vincent, Ph.D.
National Cancer Institute
National Institutes of Health
Laboratory of Molecular Biology
Building 37, Room 5120
37 Convent Drive, MSC 4264
Bethesda, MD 20892 USA
jjv5 at nih.gov
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the SciPy-user