对于一个图像的每个像素,我有它的x(int),y(int)和像素值(浮点数)。
现在我需要为图像添加噪点。是否适合numpy.random.poisson?
我很担心它,因为它不像新的pixle值=原始值+噪音,但像
new pixle value = numpy.random.poisson(原始值,1)。新值都是整数。
我的问题是标题。
我的目的是得到一个恒星的测光测量误差。但我只有一个iamge。所以我通过添加泊松噪声进行模拟。 请检查下面的ccd图像中的数字。来源是红色功能。
答案 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函数。