2017-05-25 214 views
0

我已經通過代碼試圖下面,高斯噪聲添加到RGB或灰度圖像,但是到現在爲止我有同樣的問題,結果總是如下:如何爲圖像添加噪點?

current results

那麼,我寫的代碼有問題嗎?

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) 
+2

預期結果是什麼?這也可以更加簡潔地用numpy向量添加 – user3080953

+0

您的代碼不會爲圖像添加噪點,它會有效地用噪音替代它。你需要使每個'image [i] [j]'的結果成爲已經在該位置和'gauss()'的值的函數,而不是如圖所示完全獨立於它。我也懷疑'elif len(image.shape)== 2:'應該是'elif len(image.shape)== 1:'用於灰度圖像。 – martineau

+1

P.S. Python包含['random.gauss()'](https://docs.python.org/3/library/random.html#random.gauss)高斯分佈隨機數函數。 – martineau

回答

0

我要感謝是由於蒂諾先生您指出我應該回答有關噪音,不模糊。我會再次回答枕頭,因爲我認爲它更簡單。

我打開一張麝鼠爪的圖片,並在位置(50,50)顯示圖像大小和像素值。這是一個RGB圖像,我們可以相當確信,每種顏色的範圍可以從0到255.

我想你想要添加劑高斯噪聲。爲了節省自己編寫和調試發生器的麻煩,我使用了一種易於使用的產品,normalvariate。你會想改變噪音的水平和傳播;因此我已經制作了平均值和比例參數。由於顏色值的範圍有限制,我使用maxmin。爲了方便起見,我將add_noise的三個調用打包到add_noise_one_pixel中,以便後一個例程可以針對圖像中的每個像素調用一次。

您已經注意到圖像中的所有像素都可以通過使用圖像大小和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)) 
...  

老答案:

如果你只是想,而不是關注自己關於關於做那麼看看枕頭的細節。這很簡單。

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

[高斯模糊](https://en.wikipedia.org/wiki/Gaussian_blur)與添加[高斯噪聲](https://en.wikipedia.org/wiki/Gaussian_noise)不同**。到圖像。 – martineau

+0

很高興知道(假設我記得)。 –

+0

實際上,模糊具有相反的效果,並且它經常用於_remove_(或者至少稍微隱藏)圖像中已有的噪聲。 – martineau