这是一个旧线程,但我知道这个问题的答案,所以就到这里。
答案是肯定的。
imageplusshotnoise = numpy.random.poisson(lam=<noiseless_simulated_image>, size=None)
这将从泊松分布中为原始图像的每个像素生成一个样本图像。泊松分布有一个特殊的性质,即均值和方差相等。这意味着如果平均值为 100,则方差将为 100;因此,散粒噪声的标准偏差为 10(方差等于标准偏差的平方)。
创建一个所有值都等于 100 的 numpy 图像数组
>>> 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 具有相同的均值,但标准差将等于方差的平方,在泊松分布中等于均值。
>>> 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 的输入)。随机泊松函数。