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

4
对于每个图像的像素,我有它的x(int)、y(int)坐标和像素值(float number)。
现在我需要向图像中添加噪声。使用numpy.random.poisson合适吗?
我对此感到担忧,因为它不像是新的像素值=原始值+噪声,而是类似于新的像素值=numpy.random.poisson(original value,1)。而且新值都是整数。
我的问题就是标题所述。
我的目的是获取恒星的光度测量误差。但我只有一张图片。所以我通过添加泊松噪声来进行模拟。请查看以下CCD图像中获得的图形。源是红色特征。

1
是的,简单来说是可以的。但是你的噪声统计数据是什么?它是否是多元的(如果你试图建模例如射击噪声,则可能不是)?你的图像动态范围是多少? - Henry Gomersall
噪点可能比图像更亮!如果您尝试在低光条件下使用数码相机拍照,图像通常会非常嘈杂(尽管通常已经过度压缩)。我不太明白您想要做什么-也许您可以在问题中提供更多细节。也许使用微型合成数据集展示您想要做的事情以及其中的问题。 - Henry Gomersall
所以你想创建一个上面图片的合成版本?动态范围是维基百科所说的吗?你是说噪声的统计数据是从图像中派生出来的吗?还是其他什么?这是乘性噪声吗?以下说法正确吗...?你有一张非常微弱的星星图像,它是由少量入射光子派生出来的,因此数据被编码在噪声统计数据中?(并且可能也被埋在射线噪声中?) - Henry Gomersall
我想是这样。这里的问题并不是SO需要解决的,而是与您需要使用的模型有关。我对成像系统的物理学不够熟悉,无法给出明确的答案,但使用平滑图像作为λ值似乎是一个合理的做法。为什么不在astronomy.stackexchange.comdsp.stackexchange.com上提问呢? - Henry Gomersall
不,我建议您使用原始图像(或原始图像的每个样本)作为泊松分布的参数lambda。这是numpy.random.poisson的第一个参数。关于物理方面是否合理,由您来确定,但我认为这是讨论的良好起点。此外,SO代表StackOverflow。 - Henry Gomersall
显示剩余6条评论
1个回答

5

虽然这是一个旧帖子,但我知道答案,所以来回答一下。

答案是肯定的。

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函数,对光圈内的星体响应进行建模,以获得无噪声的图像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接