将泊松噪声添加到图像中

时间:2013-10-10 07:21:04

标签: python image noise poisson

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

5 个答案:

答案 0 :(得分:10)

Helder的答案是正确的。我只想补充泊松噪声不是加性的事实,你不能把它作为高斯噪声添加。

取决于你想要达到的目标,这里有一些建议:

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

    $(document).ready(function(){
        $("#li1").click(function(){
            $(".dd1").slideToggle("fast");
    		$('.dd2').slideUp();
        });
    		$("#li2").click(function(){
    			$(".dd2").slideToggle("fast");
    			$('.dd1').slideUp();
    		});
    			$('.bgOverlay').click(function () {
    			  $('.dd1').slideUp();
    			  $('.dd2').slideUp();
    			  $('ul').slideUp();
    			});	
    
    });
    
    
    $(document).ready(function(){
        $("#nav-toggle").click(function(){
            $("ul").slideToggle(1);
    		$('.dd1').slideUp();
    		$('.dd2').slideUp();
        });
    });
  • 在干净的图像上添加噪点图层

    .navbar {
      position: fixed;
      height: 3em;
      width: 100%;
      background-color: rgba(0,0,0,0.5);
      z-index: 1;
    }
    
    .navbar ul {
      position: relative;
      display: none;
      top: 100%;
      right:-20%;
      height: 0;
      list-style: none;
      font-size: 160%;
    }
    
    .navbar ul li {
      position: relative;
      width: 60%;
      background-color: rgba(0,0,0,0.5);
      border-top: none;
      text-indent: 10px;
      color: gray;
      border-bottom: 1px solid rgba(254,254,254,0.1);
    }
    
    .navbar ul li:hover {
      background-color: rgba(0,0,0,0.6);
    }
    
    .navbar ul li a{
      text-decoration: none;
      color: rgba(254,254,254,1);
      font-weight: 100;
    }	
    
    .navbar ul ul ul, .navbar ul ul ul li {
      display: none;
    }
    
    .navbar ul ul, .navbar ul ul li {
      position: relative;
      font-size: 100%;
      background-color: rgba(0,0,0,0);
    }
    
    
    li:last-child {
      border-radius: 0px 0px 10px 10px;
    }
    
    li:first-child {
      border-top: 1px solid rgba(254,254,254,0.3);
    }
    
    .dd1 {
      display: none;
      position: relative;
      width: 100%;
      height: 100%;
      z-index: 1;
    }
    
    .dd1 li {
      font-size: 100%;
      background-color: rgba(0,0,0,0)
    }
    
    .dd2 {
      display: none;
      position: relative;
      width: 100%;
      height: 20%;
      background-color: rgba(0,0,0,0.5);
      z-index: 1;
    }
    
    #nav-toggle { 
      position: absolute;
      right: 10px;
      top: 25%; 
    }
    
    #nav-toggle {
      cursor: pointer; 
      padding: 10px 35px 16px 0px;
      z-index: 5;
    }
    
    #nav-toggle span, #nav-toggle span:before, #nav-toggle span:after {
      cursor: pointer;
      border-radius: 1px;
      height: 3px;
      width: 35px;
      background: rgba(254,254,254,0.9);
      position: absolute;
      display: block;
      content: '';
      opacity: 0.9;
    }
    
    #nav-toggle span:before {
      top: -10px; 
    }
    
    #nav-toggle span:after {
      bottom: -10px;
    }
    
    #nav-toggle span, #nav-toggle span:before, #nav-toggle span:after {
      transition: all 500ms ease-in-out;
    }

然后你可以将结果裁剪为0 - 255(如果你喜欢的话)(我使用PIL,所以我使用255而不是1)。

答案 1 :(得分:7)

实际上保罗的答案没有意义。

泊松噪声取决于信号!并且使用他提供的那些命令,后来添加到图像中的噪声与信号无关。

为了使信号依赖,你将图像传递给NumPy的泊松函数:

classmethod

答案 2 :(得分:2)

您可以使用skimage.util.random_noise

<mat-form-field>
<mat-label>Value</mat-label>
<input
        type="text"
        localizedNumericInput
        matInput
        autocomplete="off"
        formControlName="value"
      />
</mat-form-field>

答案 3 :(得分:-1)

Chapter 1book的项目 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]

答案 4 :(得分:-4)

如果您可以使用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...