【问题标题】:How to add noise to image?如何给图像添加噪点?
【发布时间】:2017-05-25 20:28:40
【问题描述】:

我尝试通过下面的代码,将高斯噪声添加到 RGB 或 GRAYSCALE 图像,但直到现在我遇到同样的问题,结果始终如下:

那么我写的代码有问题吗?

def gauss(mean,sigma):
     from random import uniform
     from math import sqrt,log,pi,cos
     a=uniform(0,1)
     b=uniform(0,1)
     x=sqrt(-2*log(a))*cos(2*pi*b)
     return(x)

def bruiter(image):
     from matplotlib.pyplot import imread
     if len(image.shape)==3 :
       a,b,c=image.shape
          for i in range(a):
             for j in range(b):
                 image[i][j] += [gauss(0.5,0.01),gauss(0.5,0.01),gauss(0.5,0.01)]

     elif len(image.shape)==2 :
       a,b= image.shape
          for i in range(a):
             for j in range(b):
                 image[i][j] +=  gauss(0.01)*(1/255)

return(image)

【问题讨论】:

  • 预期结果是什么?这也将与 numpy 向量相加更简洁
  • 您的代码不会向图像添加噪点,它会有效地将其替换为噪点。您需要使每个image[i][j] 的结果成为已经在该位置和gauss() 的值的函数,而不是完全独立于它,如图所示。我还怀疑对于灰度图像,elif len(image.shape)==2: 应该是 elif len(image.shape)==1:
  • P.S. Python包含random.gauss()高斯分布随机数函数。
  • 希望我现在给你一个更合适的答案。

标签: python image


【解决方案1】:

感谢 Martineau 先生指出我应该回答关于噪音而不是模糊的问题。我将再次用 Pillow 来回答,因为我认为它更简单。

我打开一张麝鼠爪子的图片并显示图像大小和位置 (50,50) 处的像素值。这是一个 RGB 图像,我们可以相当确定每种颜色的范围是 0 到 255。

我想你想要加性高斯噪声。为了省去编写和调试生成器的麻烦,我使用了一个现成的,normalvariate。你会想要改变噪音的水平和传播;因此,我制作了均值和比例参数。由于颜色值的范围有限制,我使用maxmin。为方便起见,我在add_noise_one_pixel 中打包了对add_noise 的三个调用,以便可以为图像中的每个像素调用后一个例程。

您已经注意到,图像中的所有像素都可以通过使用图像大小和getpixel 方法的知识来处理。

我没有检查过这段代码。它更多地是为了说明原则。

>>> from PIL import Image, ImageFilter
>>> im = Image.open('muskrat.png')
>>> im.size
(100, 117)
>>> im.getpixel((50,50))
(121, 130, 116)
>>> import random
>>> def add_noise(x, mean, stddev):
...     return min(max(0, x+random.normalvariate(mean,stddev)), 255)
... 
>>> def add_noise_one_pixel(im, x, y, mean=10, stddev=5):
...     x, y, z = im.getpixel((x,y))
...     im.putpixel((x,y), add_noise(x, mean, stddev), add_noise(y, mean, stddev), add_noise(z, mean, stddev))
...     

旧答案:

如果您只想去做,而不是关心做这件事的细节,那么看看 Pillow。就这么简单。

>>> from PIL import Image, ImageFilter
>>> im = Image.open('GENES.png')
>>> im2 = im.filter(ImageFilter.GaussianBlur(5))
>>> im2.show()

【讨论】:

  • Gaussian blurring 与将Gaussian noise 添加到图像中相同。
  • 很高兴知道(假设我记得)。
  • 事实上,模糊有相反的效果,它通常用于去除(或至少在某种程度上隐藏)图像中已经存在的噪点。
  • 奇怪的是,我用过它,但不是在代码中,只是在图片编辑器中,在这种情况下,这个名字对我没有任何意义。
猜你喜欢
  • 1970-01-01
  • 2012-07-08
  • 2015-11-07
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 2014-02-23
  • 2014-08-09
相关资源
最近更新 更多