高斯噪聲
圖像噪聲之高斯噪聲(gauss noise)
概述:
高斯噪聲是指它的概率密度函數服從高斯分布(即正態分布)的一類噪聲
與椒鹽噪聲類似(Salt And Pepper Noise),高斯噪聲(gauss noise)也是數字圖像的一個常見噪聲。
椒鹽噪聲是出如今隨機位置、噪點深度基本固定的噪聲,高斯噪聲與其相反,是差點兒每一個點上都出現噪聲、噪點深度隨機的噪聲。
算法步驟:
通過概率論里關於正態分布的有關知識能夠非常easy的得到其計算方法,高斯噪聲的概率密度服從高斯分布(正態分布)當中有means(平均值)和sigma(標准方差)兩個參數。
高斯分布(正態分布):

對於每一個輸入像素。我們能夠通過與符合高斯分布的隨機數相加, 得到輸出像素:
Pout = Pin + F(means,sigma)
獲得一個符合高斯分布的隨機數有好幾種方法,比方最主要的一個方法是使用標准的正態累積分布函數的反函數。
除此之外還有其它更加高效的方法。Box-Muller變換就是當中之中的一個。還有一個更加快捷的方法是ziggurat算法。
而python的random庫也提供了產生高斯隨機數的方法:
高斯分布
random.gauss(mu, sigma)
Gaussian distribution. mu is the mean, and sigma is the standard deviation. This is slightly faster than the normalvariate() function defined below.
給一副數字圖像加上高斯噪聲的處理順序例如以下:
a.設定參數sigma 和 Xmean
b.產生一個高斯隨機數
c.依據輸入像素計算出輸出像素
d.又一次將像素值限制或放縮在[0 ~ 255]之間
e.循環全部像素
f.輸出圖像。
編程實例:
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from numpy import*
import random
#讀取圖片並轉為數組
im = array(Image.open('./source/test.jpg'))
#設定高斯函數的偏移
means = 0
#設定高斯函數的標准差
sigma = 25
#r通道
r = im[:,:,0].flatten()
#g通道
g = im[:,:,1].flatten()
#b通道
b = im[:,:,2].flatten()
#計算新的像素值
for i in range(im.shape[0]*im.shape[1]):
pr = int(r[i]) + random.gauss(0,sigma)
pg = int(g[i]) + random.gauss(0,sigma)
pb = int(b[i]) + random.gauss(0,sigma)
if(pr < 0):
pr = 0
if(pr > 255):
pr = 255
if(pg < 0):
pg = 0
if(pg > 255):
pg = 255
if(pb < 0):
pb = 0
if(pb > 255):
pb = 255
r[i] = pr
g[i] = pg
b[i] = pb
im[:,:,0] = r.reshape([im.shape[0],im.shape[1]])
im[:,:,1] = g.reshape([im.shape[0],im.shape[1]])
im[:,:,2] = b.reshape([im.shape[0],im.shape[1]])
#顯示圖像
imshow(im)
show()
這里因為默認圖像會被編碼成無符號八位整數(unit8)。所以當進行數值計算時,假設出現大於255和小於0的情況會進行滾動,比方255 + 10 = 9 ,假設不進行處理,結果是錯誤的,所以必須轉成int計算,限制范圍后再賦值回去。以下是直接運算造成的錯誤結果(sigma = 25):
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from numpy import*
import random
#讀取圖片並轉為數組
im = array(Image.open('./source/test.jpg'))
#設定高斯函數的偏移
means = 0
#設定高斯函數的標准差
sigma = 25
#r通道
r = im[:,:,0].flatten()
#g通道
g = im[:,:,1].flatten()
#b通道
b = im[:,:,2].flatten()
#計算新的像素值
for i in range(im.shape[0]*im.shape[1]):
r[i] = r[i] + random.gauss(0,sigma)
g[i] = g[i] + random.gauss(0,sigma)
b[i] = b[i] + random.gauss(0,sigma)
im[:,:,0] = r.reshape([im.shape[0],im.shape[1]])
im[:,:,1] = g.reshape([im.shape[0],im.shape[1]])
im[:,:,2] = b.reshape([im.shape[0],im.shape[1]])
#顯示圖像
imshow(im)
show()
執行結果:
原圖
sigma = 15
sigma = 25
sigma = 40
結語:
本篇博客主要介紹了高斯噪聲這樣的常見的圖像噪聲的原理與生成。希望對大家有所幫助~