我有一些图像需要添加增量泊松噪声,以便更彻底地分析它们。我知道你可以在 MATLAB 中做到这一点,但你如何在 Python 中做到这一点?到目前为止,搜索一无所获。
5 回答
赫尔德的答案是正确的。我只想添加一个事实,即泊松噪声不是相加的,您不能将其添加为高斯噪声。
取决于您想要实现的目标,这里有一些建议:
模拟低光噪声图像(如果 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)。
实际上,保罗的回答没有意义。
泊松噪声与信号有关!并且使用他提供的这些命令,后来添加到图像中的噪声与信号无关。
为了让它依赖于信号,你应该将图像传递给 NumPy 的泊松函数:
filename = 'myimage.png'
img = (scipy.misc.imread(filename)).astype(float)
noise_mask = numpy.random.poisson(img)
noisy_img = img + noise_mask
你可以使用skimage.util.random_noise
:
from skimage.util import random_noise
noisy = random_noise(img, mode="poisson")
对于较大的平均值,泊松分布可以很好地近似为均值和方差等于泊松随机变量均值的高斯分布:
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
如果您可以使用 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...