#1 楼
如果您可以使用numpy / scipy,则以下内容应会有所帮助。我建议您将数组强制转换为浮点数以进行中间计算,然后将其强制转换回uint8以进行输出/显示。由于泊松噪声都> = 0,因此您需要决定在转换回uint8时如何处理数组溢出。您可以根据自己的目标进行缩放或截断。filename = 'myimage.png'
imagea = (scipy.misc.imread(filename)).astype(float)
poissonNoise = numpy.random.poisson(imagea).astype(float)
noisyImage = imagea + poissonNoise
#here care must be taken to re cast the result to uint8 if needed or scale to 0-1 etc...
#2 楼
赫尔德的答案是正确的。我只想补充一个事实,即泊松噪声不是加性的,您不能将其添加为高斯噪声。根据您要实现的目标,这里有一些建议:会很吵)
import numpy as np
image = read_image("YOUR_IMAGE") # need a rescale to be more realistic
noisy = np.random.poisson(image / 255.0 * PEAK) / PEAK * 255 # noisy image
在干净图像的顶部添加噪声层
import numpy as np
image = read_image("YOUR_IMAGE")
noisemap = create_noisemap()
noisy = image + np.random.poisson(noisemap)
然后,您可以根据需要将结果裁剪为0-255(我使用PIL,所以我使用255而不是1)。
#3 楼
保罗的答案实际上是没有道理的。泊松噪声取决于信号!使用他提供的那些命令,以后添加到图像的噪声与信号无关。
要使图像与信号无关,您可以将图像传递给NumPy的泊松函数: br />
filename = 'myimage.png'
img = (scipy.misc.imread(filename)).astype(float)
noise_mask = numpy.random.poisson(img)
noisy_img = img + noise_mask
评论
您的回答很有道理。虽然您如何处理造成的饱和?
– Yonatan Simson
16年2月7日在15:08
好吧,在这种情况下,您必须自己处理饱和度,将负值设置为0,并将图像位数的最大值设置为最高值。
–赫尔德
16年2月8日在9:13
谢谢。我通过饱和顶部5%的像素来处理它
– Yonatan Simson
16年2月8日在14:02
不会存在泊松分布噪声的内在和外在来源吗?
–user391339
16-3-30在2:24
我不认为泊松噪声像高斯噪声一样是加性的。请参考@ yuxiang.li的答案以供参考。
–stochastic_zeitgeist
17 Mar 29 '17 at 4:54
#4 楼
您可以使用skimage.util.random_noise
: from skimage.util import random_noise
noisy = random_noise(img, mode="poisson")
#5 楼
从本书第1章的项目1.4.4-“泊松分布的高斯近似”:对于较大的平均值,泊松分布可以由均值和方差相等的高斯分布很好地近似到泊松随机变量的均值:
P(μ)≈N(μ,μ)
然后,我们可以从正态分布N(0,1)产生泊松噪声,用μ的平方根缩放其标准偏差,并将其添加到图像中,即μ值:
# Image size
M, N = 1000, 1000
# Generate synthetic image
image = np.tile(np.arange(0,N,dtype='float64'),(M,1)) * 20
# -- sqrt(mu) * normal(0,1) --
poisson_noise = np.sqrt(image) * np.random.normal(0, 1, image.shape)
# Add the noise to the mu values
noisy_image = image + poisson_noise
plt.figure(figsize=(10,10))
plt.subplot(2,2,1)
plt.title('Image')
plt.imshow(image,'gray')
plt.subplot(2,2,2)
plt.title('Noisy image noise')
plt.imshow(noisy_image,'gray')
plt.subplot(2,2,3)
plt.title('Image profile')
plt.plot(image[0,:])
plt.subplot(2,2,4)
plt.title('Noisy image profile')
plt.plot(noisy_image[0,:])
print("Synthetic image mean: {}".format(image[:,1].mean()))
print("Synthetic image variance: {}".format(image[:,1].var()))
print("Noisy image mean: {}".format(noisy_image[:,1].mean()))
print("Noisy image variance: {}".format(noisy_image[:,1].var()))
由于泊松噪声与信号有关,所以当我们增加基础信号时,噪声方差也会增加,如我们在该行中看到的配置文件:
单列统计信息的输出:
合成图像均值:20.0
合成图像方差:0.0
噪声图像均值:19.931120555821597
噪声图像方差:19.39456713877459
其他参考文献:[1] [2]
评论
泊松分布生成整数。如果图像是范围为[0,1]的np.float数组,则正确的代码应为嘈杂= np.random.poisson(image * 255.0 * PEAK)/ PEAK / 255
–misssprite
17年5月9日在6:18
在这种情况下,create_noisemap是什么?
– moi
2月5日9:40
什么是create_noisemap ...?
–ch271828n
3月13日在0:22