向图像添加泊松噪声

问题描述 投票:0回答:5

我有一些图像需要添加增量的泊松噪声,以便更彻底地分析它们。我知道你可以在 MATLAB 中做到这一点,但是你如何在 Python 中做到这一点呢?到目前为止,搜索还没有任何结果。

python image noise poisson
5个回答
18
投票

Helder的答案是正确的。我只是想补充一点,泊松噪声不是可加性的,您不能将其添加为高斯噪声。

根据您想要实现的目标,这里有一些建议:

  • 模拟低光噪声图像(如果 PEAK = 1,它会非常嘈杂)

    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)。


17
投票

其实Paul的回答没有道理。

泊松噪声与信号相关!使用他提供的这些命令,后来添加到图像中的噪声与信号无关。

要使其与信号相关,您应该将图像传递给 NumPy 的泊松函数:

filename = 'myimage.png'
img = (scipy.misc.imread(filename)).astype(float)

noise_mask = numpy.random.poisson(img)

noisy_img = img + noise_mask

5
投票

您可以使用

skimage.util.random_noise

from skimage.util import random_noise

noisy = random_noise(img, mode="poisson")

1
投票

来自本本书第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()))
由于泊松噪声与信号相关,因此当我们增加基础信号时,噪声方差也会增加,正如我们在此行配置文件中看到的:

image

单列统计输出:

合成图像平均值:20.0

合成图像方差:0.0

噪声图像平均值:19.931120555821597

噪声图像方差:19.39456713877459

更多参考:[

1][2]


-8
投票
如果您可以使用 numpy/scipy,那么以下内容应该会有所帮助。我建议您将数组转换为 float 以进行中间计算,然后转换回 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...
    
© www.soinside.com 2019 - 2024. All rights reserved.