[SciPy-User] Fwd: one-sided gauss fit -- or: how to estimate backgound noise ?

Zachary Pincus zachary.pincus@yale....
Tue Jul 20 14:33:41 CDT 2010

> Zach,
> thanks for your reply. The idea is to calculate the mean/std of the
> *background noise* of the underlying (2d or 3d) image data based on
> the image's 1d image intensity histogram.
> Regarding the "tail", the problem is that in general the signal
> intensities are not well separated from the background. Thus, the
> right half of the background's (Gaussian) noise distribution may
> already be significantly miss-shaped - whereas the left side, i.e. all
> values below the mean background level, should be nicely Bell-shape
> distributed. (This idea comes also from looking at many hundreds of
> image histogram [my wx/OpenGL based image viewer always displays the
> image intensity histogram right below the image])

Right... if you're in the regime that I'm in where there are orders of  
magnitude more background pixels than foreground ones, then a robust  
estimator of mean/std (e.g. one that's immune to "outliers" aka  
foreground pixel intensities) has, in my experience, worked very well  
for this precise task: estimating the mean/std of the majority of the  
pixels (background) in the presence of possibly many outlier pixels  
(foreground). I seem to recall that the MCD estimator can work in the  
presence of ~30% outliers...


>> From your answer I just got the idea of changing the error function  
>> in
> such a way to only sum up the datapoint-model-errors (IOW, build the
> RMS) over intensities smaller than the models mean value.  So, the
> resulting question becomes if the error function has the Gaussian-mean
> value of the "current" fitting step available to it !? I can probably
> find that out.
> Thanks again,
> Sebastian
>> Though, now that I think on it, I seem to recall that the EM  
>> algorithm
>> was originally deployed to estimate parameters of gaussians with
>> censored tails. (I think the problem was: how tall was the average
>> Frenchman, given distribution of heights of French soldiers and the
>> knowledge that there was a height minimum for army service?) I think
>> you just estimate the mean/std from the censored data, then fill in
>> the censored tails with samples from the fit distribution, and then  
>> re-
>> estimate the mean/std from the new data, etc. I forget exactly how  
>> one
>> does this (does it work on the histogram, or the underlying data,
>> e.g.) but that's the general idea.
>> Zach
>>> Thanks,
>>> Sebastian.
>>> On Fri, Jul 16, 2010 at 1:04 AM, Christoph Deil
>>> <Deil.Christoph@googlemail.com> wrote:
>>>> Hi Sebastian,
>>>> in astronomy a method called kappa-sigma-clipping is sometimes used
>>>> to estimate the background level by clipping away most of the  
>>>> signal:
>>>> http://idlastro.gsfc.nasa.gov/ftp/pro/math/meanclip.pro
>>>> I am not aware of a python implementation, but it's just a few
>>>> lines of code.
>>>> If you can identify the background level approximately by eye,
>>>> e.g. by plotting a histogram of your data, you should be able to
>>>> just fit the tail of the Gaussian that only contains background.
>>>> Here is my attempt at doing such a fit using
>>>> scipy.stats.rv_continous.fit(),
>>>> similar to but not exactly what you want:
>>>> from scipy.stats import norm, halfnorm, uniform
>>>> signal = - uniform.rvs(0, 3, size=10000)
>>>> background = norm.rvs(size=10000)
>>>> data = hstack((signal, background))
>>>> hist(data, bins=30)
>>>> selection = data[data>0]
>>>> halfnorm.fit(selection)
>>>> x = linspace(-3, 3, 100)
>>>> y = selection.sum() * halfnorm.pdf(x)/3
>>>> plot(x,y)
>>>> Good luck!
>>>> Christoph
>>>> On Jul 15, 2010, at 10:39 PM, Sebastian Haase wrote:
>>>>> Hi,
>>>>> In image analysis one is often faced with (often unknown)  
>>>>> background
>>>>> levels (offset) + (Gaussian) background noise.
>>>>> The overall intensity histogram of the image is in fact often
>>>>> Gaussian
>>>>> (Bell shaped), but depending on how many (foreground) objects are
>>>>> present the histogram shows a positive tail of some sort.
>>>>> So, I just got the idea if there was a function (i.e. mathematical
>>>>> algorithm) that would allow to fit only the left half of a  
>>>>> Gaussian
>>>>> bell curve to data points !?
>>>>> This would have to be done in a way that the center, the variance
>>>>> (or
>>>>> sigma) and the peak height are free fitting parameters.
>>>>> Any help or ideas are appreciated,
>>>>> thanks
>>>>> Sebastian Haase
> _______________________________________________
> SciPy-User mailing list
> SciPy-User@scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user

More information about the SciPy-User mailing list