高斯噪聲


高斯噪聲

圖像噪聲之高斯噪聲(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

這里寫圖片描寫敘述

結語:

本篇博客主要介紹了高斯噪聲這樣的常見的圖像噪聲的原理與生成。希望對大家有所幫助~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM