Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向图像添加泊松噪声_Python_Image_Noise_Poisson - Fatal编程技术网

Python 向图像添加泊松噪声

Python 向图像添加泊松噪声,python,image,noise,poisson,Python,Image,Noise,Poisson,我有一些图像,我需要增加泊松噪声的增量,以便更彻底地分析它们。我知道你可以在MATLAB中实现这一点,但是你如何在Python中实现这一点呢?到目前为止,搜索没有产生任何结果。如果您可以使用numpy/scipy,那么以下内容应该会有所帮助。我建议您将数组强制转换为float进行中间计算,然后再强制转换回uint8进行输出/显示。由于poisson noise都>=0,您将需要决定在返回uint8时如何处理数组溢出。您可以根据您的目标进行缩放或截断 filename = 'myimage.png

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

如果您可以使用numpy/scipy,那么以下内容应该会有所帮助。我建议您将数组强制转换为float进行中间计算,然后再强制转换回uint8进行输出/显示。由于poisson noise都>=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...

事实上,保罗的回答毫无意义

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

要使其依赖于信号,应将图像传递给NumPy的泊松函数:

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

noise_mask = numpy.random.poisson(img)

noisy_img = img + noise_mask

赫尔德的回答是正确的。我只想补充一个事实,泊松噪声不是加性的,你不能把它加为高斯噪声

根据您想要实现的目标,以下是一些建议:

  • 模拟一个低光噪声图像(如果峰值=1,它将非常噪声)

  • 在干净图像的顶部添加噪波层

    import numpy as np
    image = read_image("YOUR_IMAGE") 
    noisemap = create_noisemap() 
    noisy = image + np.random.poisson(noisemap)  
    
然后,如果愿意,您可以将结果裁剪为0-255(我使用PIL,所以我使用255而不是1)

您可以使用:

从skimage.util导入随机噪声
噪声=随机噪声(img,mode=“泊松”)
来自本标准第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


更多参考资料:[]

您的回答有道理。但是你如何处理这导致的饱和度呢?嗯,在这种情况下,你必须自己处理饱和度,将负值设置为0,并将图像位数的最大值设置为大于该值的值。谢谢。我通过饱和顶部5%的像素来处理它。难道没有内部和外部的泊松分布噪声源吗?我不认为泊松噪声像高斯噪声一样是加性的。请参考@yuxiang.li的答案。泊松分布生成整数。如果图像是一个范围为[0,1]的np.float数组,正确的代码应该是
noise=np.random.poisson(image*255.0*PEAK)/PEAK/255
在这种情况下什么是
create\u noisemap
什么是
create\u noisemap
…?答案已经纠正,但仍然被否决,这很令人困惑。。。Stackoverflow肯定需要重新放大。我确实尝试解决了最初对downvote@6infinity8的担忧,因为这是我想跟上时代并解决任何担忧的事情。我对泊松函数的使用最初是关闭的,但现在已经修复了。很高兴你注意到了。当然,谢谢你纠正它!我只是对stackoverflow感到不安,他们的系统只是让试图理解的人更加困惑。
# 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()))