我正在尝试在MATLAB中将泊松噪声添加到一个非常简单的图像中。
im = ones(256, 256);
noisy = imnoise(im, 'poisson');
在阅读this回答之后,我也试过了。
im = ones(256, 256);
noisy = imnoise(im2double(im), 'poisson');
无济于事。
我也尝试过im = zeros(256, 256)
,但也没有做任何事情。
答案 0 :(得分:1)
来自the documentation of imnoise
:
如果
I
是双精度,则输入像素值被解释为由1e12
按比例放大的泊松分布的平均值。例如,如果输入像素的值为5.5e-12
,则相应的输出像素将从均值为5.5
的泊松分布生成,然后按1e12
缩小。
当输入为uint8
:
im = ones(256, 256, 'uint8');
noisy = imnoise(im, 'poisson');
在双精度的情况下,有两个问题:
1e12
的缩放似乎过多。这意味着输出取自泊松分布,均值为1e12
,然后除以1e12
。平均值为1
,标准差为sqrt(1e-12)=1e-6
。也就是说,标准偏差很小,强度变化不可见。如果您使用format long
,MATLAB将显示以下值:
>> format long
>> min(noisy(:))
ans =
0.999996115518000
>> max(noisy(:))
ans =
1
最后一个结果(最大值为1)表示MATLAB将结果剪辑到[0,1]范围,因为双精度图像应该在该范围内。因此,您的代码返回的分布不是泊松,它的平均值是泊松截断。
因此,对于浮点图像,首先适当地缩放它们:
noisy = imnoise(im * 1e-12, 'poisson') * 1e12;
(如果更适合你,可以使用不同的因素)。
答案 1 :(得分:0)
我尝试使用here.
从互联网上拍摄的图像I = imread('stick.jpg');
imshow(I)
J = imnoise(I,'poisson');
imshow(J)
如果我带你的并将其改为高斯,你会看到差异。
I = ones(256,256);
imshow(I)
J = imnoise(I,'gaussian');
imshow(J)
我还没有对此进行足够的阅读,但我的信念是因为图像具有均匀的强度throughout.