numpy.random.poisson可以用来为图像添加泊松噪声吗?

时间:2013-10-16 07:40:50

标签: image image-processing numpy noise

对于一个图像的每个像素,我有它的x(int),y(int)和像素值(浮点数)。

现在我需要为图像添加噪点。是否适合numpy.random.poisson?

我很担心它,因为它不像新的pixle值=原始值+噪音,但像

new pixle value = numpy.random.poisson(原始值,1)。新值都是整数。

我的问题是标题。

我的目的是得到一个恒星的测光测量误差。但我只有一个iamge。所以我通过添加泊松噪声进行模拟。 请检查下面的ccd图像中的数字。来源是红色功能。

enter image description here

1 个答案:

答案 0 :(得分:5)

这是一个老线程,但我知道答案,所以这里。

答案是肯定的。

imageplusshotnoise = numpy.random.poisson(lam=<noiseless_simulated_image>, size=None)

这将从原始图像的每个像素的泊松分布产生样本图像。泊松分布具有特殊属性,其中均值和方差相等。这意味着,如果平均值为100,那么方差将为100;因此,散粒噪声的标准偏差为10(方差等于标准偏差的平方)。

创建一个numpy图像数组,其中所有值都等于100

>>> myimage = 100 * np.ones((100,100))
>>> np.mean(myimage)
100.0
>>> np.std(myimage)
0.0

请注意,均值为100,标准偏差为0

现在使用此图像作为泊松分布的lambda将从该分布中生成具有相同大小的样本

>>> imageplusnoise = np.random.poisson(lam=myimage, size=None)
>>> imageplusnoise.shape
(100, 100)

样本的均值与lambda具有相同的均值,但标准差将等于方差的sqrt,其在泊松分布中等于均值。

>>> np.mean(imageplusnoise)
100.0474
>>> np.std(imageplusnoise)
10.015934965843179

为了只获得散粒噪声,从中简单地减去lambda,现在平均值将接近零(如果平均值很小,平均噪声将从零开始进一步偏斜),但它总是具有相同的标准偏差。

>>> noiseonlyimage = imageplusnoise - myimage
>>> np.mean(noiseonlyimage)
0.047399999999999998
>>> np.std(noiseonlyimage)
10.015934965843179

这里应该指出,lam参数是泊松分布的期望值,并且是无噪声的。你的起始图像看起来已经有了噪音,所以我首先要通过你的光圈模拟星形响应来获得无噪声的图像,比如使用一些点扩散函数,比如通风盘,sinc函数或类似numpy的输入。 random.poisson函数。