[AstroPy] JointFitter help

Brandon Swift bjswift at gmail.com
Wed Feb 4 14:22:00 EST 2015


Sure thing, Nadia. In case you/someone else doesn't know, a regular digital
camera has an alternating color filter pattern over the CMOS detectors like
this http://en.wikipedia.org/wiki/Bayer_filter. I am trying to take a
picture of a point-like source that has contrast to the surrounding
background, and nail down the centroid of that as well (and as fast) as I
reasonably can. I figure that using the raw pixel data instead of using the
demosaiced and otherwise-processed JPEG that normally comes out the back
end of the camera will help.

So, yes, I'm trying to fit a 2D gaussian to R, G, and B channels
simultaneously, each of which has their own checkerboard-like mask, like in
the attached image/below.


​
When doing the gaussian fit, the x/y_mean should be tied together between
the 3 channels, and the x/y_stddev and theta should also be tied (to within
chromatic effects of the lens), but the amplitude of each channel should be
allowed to be different. Which all sounds very much like the example
use-case described in the docstring of the JointFitter class!

I had moderate success with fitting individual channels (convergence was
sometimes flaky) and was about to try writing a custom 'Gaussian2Dx3' model
class when I ran across JointFItter and thought it seemed like it would do
nicely. Right now, I'm doing something like this, which isn't working right
because I don't know how the inputs need to go but I've been trying to
guess from the source code and errors generated:

--------------------------------------------------------------------------------------------------------
## Define reasonable ranges for the fitting parameters (data centered at
0,0 pixel)
gaussbounds = {'amplitude': [0.2, 0.8],  'x_mean':    [-2.0, 2.0],
 'y_mean':    [-2.0, 2.0], 'x_stddev':  [0.2, 1.5], 'y_stddev':  [0.2, 1.5]}

## Create a model instance for each channel
gaussR = models.Gaussian2D(0.5, 0.0, 0.0, 0.4, 0.4, bounds=gaussbounds)
gaussG = models.Gaussian2D(0.5, 0.0, 0.0, 0.4, 0.4, bounds=gaussbounds)
gaussB = models.Gaussian2D(0.5, 0.0, 0.0, 0.4, 0.4, bounds=gaussbounds)

## Trying to get these other inputs structured correctly to make
JointFitter.__init__()
## complete smoothly.
jointpars = {'gaussR':   [gaussR.x_mean, gaussR.y_mean, gaussR.x_stddev,
gaussR.y_stddev, gaussR.theta],
             'gaussG':   [gaussG.x_mean, gaussG.y_mean, gaussG.x_stddev,
gaussG.y_stddev, gaussG.theta],
             'gaussB':   [gaussB.x_mean, gaussB.y_mean, gaussB.x_stddev,
gaussB.y_stddev, gaussB.theta] }
initvals = [0.0, 0.0, 0.4, 0.4, 0.0]

## Here's what I'm feeding it, finally. I'm out of ideas!
jointRGB = fitting.JointFitter({'gaussR':gaussR, 'gaussG':gaussG,
'gaussB':gaussB}, jointpars, initvals)
--------------------------------------------------------------------------------------------------------

Anyway, many thanks in advance for the help! Cheers,
Brandon



> Date: Wed, 4 Feb 2015 14:38:44 +0000
> From: Nadezhda Dencheva <dencheva at stsci.edu>
> Subject: Re: [AstroPy] JointFitter help
>
> Hi Brandon,
>
> Can you explain a bit more how you are doing the fitting?
> It sounds like you are fitting a 2D Gaussian but I'm not sure what the
data is?
> What are the inputs to each model?
>
> Cheers,
> Nadia
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/astropy/attachments/20150204/898c4834/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: rgbspot.png
Type: image/png
Size: 1980 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/astropy/attachments/20150204/898c4834/attachment.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: rgbspot.png
Type: image/png
Size: 1980 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/astropy/attachments/20150204/898c4834/attachment-0001.png>


More information about the AstroPy mailing list