當前位置:菜譜大全網 - 素菜食譜大全 - C#給圖像添加高斯噪聲

C#給圖像添加高斯噪聲

///& lt;總結& gt

///高斯密度函數

///& lt;/summary & gt;

///& lt;param name = " z " & gt隨機數

///& lt;param name = " u " & gt數學的期望值

///& lt;param name = " a " & gt差異

///& lt;returns & gt& lt/returns & gt;

靜態雙gossp(雙z、雙u、雙a)

{

雙p;

p = ( 1 / (a *數學。Sqrt(2 *數學。PI)) *

數學。Pow(數學。e,-(數學。Pow(z - u,2)/(2 * a * a))));

返回p;

}

///& lt;總結& gt

///對圖形進行高斯噪聲處理。

///& lt;/summary & gt;

///& lt;param name = " img " & gt& lt/param & gt;

///& lt;param name = " u " & gt數學的期望值

///& lt;param name = " a " & gt差異

///& lt;returns & gt& lt/returns & gt;

靜態公共位圖goss_noise(Image img,double u,double a)

{

int寬度= img。寬度;

int height = img。身高;

Bitmap bitmap2 =新位圖(img);

Rectangle rectangle1 =新矩形(0,0,寬度,高度);

PixelFormat格式=位圖2。像素格式;

位圖數據data =位圖2。LockBits(rectangle1,ImageLockMode。讀寫,格式化);

IntPtr ptr = data。Scan0

int numBytes = width * height * 4;

byte[] rgbValues =新字節[numBytes];

法警。Copy(ptr,rgbValues,0,numBytes);

Random Random 1 = new Random();

for(int I = 0;我& lt數字字節;i += 4)

{

for(int j = 0;j & lt3;j++)

{

雙z;

z = random1。next double()-0.5+u;

double pz = gossp(z,u,a);

double r = random1。next double();

//調試。writeline if(pz & lt;0.1,字符串。format(" z = { 0 } \ tpz = { 1 } \ tr = { 2 } ",z,pz,r));

if(r & lt;= pz)

{

double p = RGB values[I+j];

p = p+z * 128;

如果(p & gt255)

p = 255

如果(p & lt0)

p = 0;

rgbValues[i + j] =(字節)p;

}

}

}

法警。Copy(rgbValues,0,ptr,numBytes);

位圖2。解鎖位(數據);

返回位圖2;

}

要回答這三個問題,妳需要先了解概率密度函數的意義。

高斯密度函數的含義是:

如果壹個隨機數出現多次,其平均值為U,方差為A,那麽這個隨機數序列中出現壹個特定Z值的概率是多少?

所以需要產生壹個隨機數z,然後用高斯函數知道它出現的概率。

也就是pz。

那麽,在知道了這個Z“應該”的概率之後,就要想辦法讓他按照這個概率作用於原圖上的像素。

所以采用第二個隨機數R,R是平均概率的0-1的數,所以概率R,R小於等於pz正好等於pz。

所以,如果隨機量Z在R小於等於pz時起作用,那麽Z的概率就是pz。

這樣,對於n z的,他的概率客觀上服從高斯分布。

最後,關於-0.5的原因:

這就涉及到z的範圍了。

原則上,如果產生的噪聲在-128和+128之間,且數學期望為0,方差為0.1,則產生Z(壹般在數十位數值)的概率幾乎為零,不可能產生可見幹擾。

所以我考慮是否采用壹個-0.5到+0.5的z值,讓z的概率足夠大,在方差為0.1時產生足夠的噪聲。

但是這樣z的值太小,只在-0.5到+0.5的範圍內,對圖像的幹擾不明顯,所以我盡量把z看成壹個比例值,放大到-128到+128的範圍,這樣對圖像的幹擾大到可以觀察到處理後的效果。