简体   繁体   English

向图像添加泊松噪声

[英]Adding poisson noise to an image

I have some images that I need to add incremental amounts of Poisson noise to in order to more thoroughly analyze them.我有一些图像需要添加增量泊松噪声,以便更彻底地分析它们。 I know you can do this in MATLAB, but how do you go about doing it in Python?我知道你可以在 MATLAB 中做到这一点,但你如何在 Python 中做到这一点? Searches have yielded nothing so far.到目前为止,搜索一无所获。

The answer of Helder is correct.海尔德的回答是正确的。 I just want to add the fact that Poisson noise is not additive and you can not add it as Gaussian noise.我只想补充一个事实,即泊松噪声不是可加性的,您不能将其添加为高斯噪声。

Depend on what you want to achieve, here is some suggestions:取决于您想要实现的目标,这里有一些建议:

  • Simulate a low-light noisy image (if PEAK = 1, it will be really noisy)模拟低光噪声图像(如果 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
  • Add a noise layer on top of the clean image在干净的图像上添加一个噪声层

    import numpy as np image = read_image("YOUR_IMAGE") noisemap = create_noisemap() noisy = image + np.random.poisson(noisemap)

Then you can crop the result to 0 - 255 if you like (I use PIL so I use 255 instead of 1).然后,您可以根据需要将结果裁剪为 0 - 255(我使用 PIL,因此我使用 255 而不是 1)。

Actually the answer of Paul doesnt make sense.其实保罗的回答没有意义。

Poisson noise is signal dependent!泊松噪声取决于信号! And using those commands, provided by him, the noise later added to the image is not signal dependent.使用他提供的这些命令,后来添加到图像中的噪声与信号无关。

To make it signal dependent you shold pass the image to the NumPy's poisson function:为了使其依赖于信号,您应该将图像传递给 NumPy 的泊松函数:

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

noise_mask = numpy.random.poisson(img)

noisy_img = img + noise_mask

You could use skimage.util.random_noise :您可以使用skimage.util.random_noise

from skimage.util import random_noise

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

From the item 1.4.4 - "Gaussian Approximation of the Poisson Distribution" of Chapter 1 of this book :来自本书第 1 章的第1.4.4- “泊松分布的高斯近似”

For large mean values, the Poisson distribution is well approximated by a Gaussian distribution with mean and variance equal to the mean of the Poisson random variable:对于较大的平均值,泊松分布可以很好地近似为高斯分布,其均值和方差等于泊松随机变量的均值:

P(μ) ≈ N (μ,μ) P(μ) ≈ N (μ,μ)

Then, we can generate Poisson noise from a normal distribution N (0,1), scale its standard deviation by the square root of μ and add it to the image which is the μ value:然后,我们可以从正态分布 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()))

As Poisson noise is signal-dependent, as we increase the underlying signal the noise variance also increases, as we can see in this row profiles:由于泊松噪声是信号相关的,当我们增加基础信号时,噪声方差也会增加,正如我们在此行配置文件中所见:

形象

Output for statistics in a single column:单列中的统计输出:

Synthetic image mean: 20.0合成图像平均值:20.0

Synthetic image variance: 0.0合成图像方差:0.0

Noisy image mean: 19.931120555821597噪声图像的意思是:19.931120555821597

Noisy image variance: 19.39456713877459噪声图像方差:19.39456713877459

Further references: [ 1 ][ 2 ]进一步参考:[ 1 ][ 2 ]

If numpy/scipy are available to you, then the following should help.如果您可以使用 numpy/scipy,那么以下内容应该会有所帮助。 I recommend that you cast the arrays to float for intermediate computations then cast back to uint8 for output/display purposes.我建议您将数组转换为浮动以进行中间计算,然后转换回 uint8 以用于输出/显示目的。 As poisson noise is all >=0, you will need to decide how you want to handle overflow of your arrays as you cast back to uint8.由于泊松噪声全部 >=0,您需要决定如何在转换回 uint8 时处理数组溢出。 You could scale or truncate depending on what your goals were.您可以根据您的目标进行缩放或截断。

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...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM