虽然这是一个旧帖子,但我知道答案,所以来回答一下。
答案是肯定的。
imageplusshotnoise = numpy.random.poisson(lam=<noiseless_simulated_image>, size=None)
这将为原始图像的每个像素生成一个Poisson分布的样本图像。 Poisson分布具有特殊属性,即平均值和方差相等。 这意味着如果平均值为100,方差将为100; 因此,shot noise的标准偏差将为10(方差等于标准偏差的平方)。
创建一个numpy图像数组,所有值都等于100。
>>> myimage = 100 * np.ones((100,100))
>>> np.mean(myimage)
100.0
>>> np.std(myimage)
0.0
请注意,均值为100,标准偏差为0,符合预期。
现在使用该图像作为泊松分布的λ将产生相同大小的样本。
>>> imageplusnoise = np.random.poisson(lam=myimage, size=None)
>>> imageplusnoise.shape
(100, 100)
样本的均值与lambda相同,但标准差等于方差的平方根,在泊松分布中等于均值。
>>> np.mean(imageplusnoise)
100.0474
>>> np.std(imageplusnoise)
10.015934965843179
为了获得仅有的光子噪声,只需从中减去λ,这样均值就会接近于零(如果均值较小,则平均噪声将开始偏离零),但它的标准差总是相同的。
>>> noiseonlyimage = imageplusnoise - myimage
>>> np.mean(noiseonlyimage)
0.047399999999999998
>>> np.std(noiseonlyimage)
10.015934965843179
这里需要指出的是,lam参数是泊松分布的期望值,是无噪声的。您的起始图像看起来已经有噪声了,因此我建议通过使用一些点扩散函数(如空气盘、sinc函数或类似物)作为输入到numpy.random.poisson函数,对光圈内的星体响应进行建模,以获得无噪声的图像。
numpy.random.poisson
的第一个参数。关于物理方面是否合理,由您来确定,但我认为这是讨论的良好起点。此外,SO代表StackOverflow。 - Henry Gomersall