灰度图像--图像增强 双边滤波 Bilateral Filtering
from:http://www.mamicode.com/info-detail-449413.html
開(kāi)篇廢話
? ? ?廢話開(kāi)始,話說(shuō)昨天寫博客寫完了,發(fā)表以后居然刷出來(lái)的是空白,頓時(shí)很生氣,因?yàn)閷懥艘簧衔绲臇|西瞬間就沒(méi)了,于是在微博上吐槽了csdn,于是csdn的官方微博和客服微博都跟我進(jìn)行了溝通和道歉,感覺(jué)態(tài)度還是不錯(cuò)的,作為用戶沒(méi)有付給他們錢,但還是受到了不小的重視,感覺(jué)還是不錯(cuò)。學(xué)習(xí)是一個(gè)被分享之后經(jīng)過(guò)自己加工后再分享的過(guò)程,一個(gè)分享的平臺(tái)是很重要的選擇,好的平臺(tái)能夠?qū)W到知識(shí),并能分享知識(shí),和別人討論知識(shí),收集資源分享資源。希望大家共同進(jìn)步。
? ? ? ?圖像增強(qiáng),平滑第二天,雖然說(shuō)是第二天,但要學(xué)習(xí)和研究包括寫程序,都不是一天完成的。上一篇寫的是線性濾波模板,此類模板我們可以叫他們靜態(tài)模板,因?yàn)槠渲灰蕾囉谖覀兊倪x擇,我們一旦選擇完成,模板就唯一確定,不會(huì)在卷積的過(guò)程中產(chǎn)生變換,所以這類模板具有線性性質(zhì),但缺點(diǎn)是不靈活,不能根據(jù)不同灰度變化情況來(lái)實(shí)時(shí)的調(diào)整權(quán)重,雙邊濾波就是一種非線性模板,能夠根據(jù)像素位置和灰度差值的不同產(chǎn)生不同的模板,得到不同的濾波結(jié)果。
基本思路
? ? ??雙邊濾波器是針對(duì)高斯平滑的提升版本,高斯平滑根據(jù)像素鄰域的距離決定權(quán)重,生成權(quán)重的函數(shù)為高斯函數(shù),所以叫高斯平滑或者高斯濾波,效果是使圖像模糊,并一定程度上的保存邊緣,雙邊濾波的改進(jìn)是增加了灰度值的影響,也就是鄰域的像素灰度值如果和中心像素的灰度值越接近,那么權(quán)值在高斯權(quán)值的基礎(chǔ)上在加上一個(gè)相對(duì)較大的權(quán)值,相反,如果灰度差很大,將會(huì)給已生成的高斯模板對(duì)應(yīng)的位置加上一個(gè)小的權(quán)值,以此類推,并將模板系數(shù)歸一化(和為1,其目的是完全平滑的圖像結(jié)果不變),因此模板的系數(shù)不再單純的依賴位置關(guān)系,更依賴于灰度關(guān)系,因此邊緣將能夠被有效的保存。
數(shù)學(xué)基礎(chǔ)
? ? ??數(shù)學(xué)開(kāi)始,數(shù)學(xué)公式可能看的比較難懂,但是懂了以后就會(huì)徹底理解整個(gè)算法,上面的描述只需要幾個(gè)公式就能準(zhǔn)確的表示出來(lái)。 ? ? ? ?來(lái)看基礎(chǔ)版本的公式,這個(gè)公式通用均值濾波和高斯濾波:
? ? ? ?上式中:將上式中的積分腦補(bǔ)成求和,求和范圍是模板覆蓋的范圍,就代表模板的坐標(biāo)位置(x,y),X就可以表示參數(shù),比如高斯里的標(biāo)準(zhǔn)差參數(shù)。1/kd(x)為歸一化參數(shù),保證絕對(duì)平滑的位置灰度值不變,c的選擇比較靈活,如果選擇高斯函數(shù),那么就產(chǎn)生了高斯濾波模板。
上面是只利用位置(距離)產(chǎn)生模板系數(shù)的公式。下面我看一下只利用灰度信息產(chǎn)生一個(gè)模板(非線性):
f表示灰度分布,也就是模板內(nèi)被覆蓋的灰度值,x(向量)代表原點(diǎn)位置,向量代表當(dāng)前求和位置,同樣積分改成求和,求和區(qū)間為模板覆蓋的區(qū)間,同樣1/kr(x)是歸一化參數(shù),保證平滑圖片的不變性。
? ? ? ?根據(jù)上面的描述,函數(shù)c只根據(jù)位置來(lái)平滑,平滑效果好,但邊緣保存弱,函數(shù)s只根據(jù)灰度差值產(chǎn)生模板,邊緣保存效果好,平滑效果差。 ? ? ? ?為了得到一個(gè)邊緣保持性好,同時(shí)平滑能力強(qiáng)的方法,我們決定將他們合體:
? ? ? 這個(gè)公式總和了上面兩種處理方法,同時(shí)根據(jù)距離和灰度差值產(chǎn)生模板系數(shù),產(chǎn)生了一種新的非線性模板,歸一化的k計(jì)算如下:
? ? ? ?對(duì)于圖像,腦補(bǔ)成求和而不是積分,這個(gè)就是Bilateral Filter的形式,也就是說(shuō),c和s并沒(méi)有規(guī)定為高斯函數(shù),如果你有更好的,可以自己開(kāi)發(fā),當(dāng)然最一般的情況下,c和s我們選擇高斯函數(shù): ? ? ? ?其中d表示距離,這里用歐氏距離來(lái)計(jì)算(歐氏距離就是初中學(xué)的最簡(jiǎn)單的那個(gè)):? ? ? ? ?deta_d為距離的標(biāo)準(zhǔn)差,由我們手動(dòng)決定,但要注意的是,標(biāo)準(zhǔn)差對(duì)于一個(gè)高斯函數(shù)來(lái)說(shuō),決定的是它的“胖瘦”,也就是圖形是寬還是窄,如果過(guò)窄,其中心權(quán)重接近1,其他權(quán)重會(huì)很小,極限情況下退化成沖擊,則只有中心位置元素,如果標(biāo)準(zhǔn)差選擇過(guò)大,高斯函數(shù)會(huì)過(guò)胖,也就是趨于一條直線,這時(shí)高斯平滑接近于均值,每個(gè)位置權(quán)重過(guò)于接近,并且,距離超過(guò)3倍的deta,那么權(quán)重也會(huì)很小,所以這個(gè)性質(zhì)在我們選擇參數(shù)和后面觀察結(jié)果也是很有用的參考。 ? ? ? ?同理我們選擇高斯函數(shù)作為s函數(shù):
? ? ? ? 式子中灰度差為:
? ? ? ?也就是模板內(nèi)不同位置的灰度與中心灰度的差。 ? ? ? ?觀察下處理結(jié)果,英文不難,不再翻譯:
? ? ? ?來(lái)看原始論文的效果:
?主要觀察點(diǎn)在貓咪的胡須,看到即使右下角特別模糊的情況下,貓咪的胡須還是可以識(shí)別出來(lái)的。
代碼
? ? ?與前面文章同樣,代碼未經(jīng)過(guò)優(yōu)化,知識(shí)原始公式的翻譯,如果應(yīng)用于工程,需要使用快速算法或?qū)⑺惴ㄟM(jìn)行優(yōu)化: //高斯函數(shù) double gaussian(double x,double deta){return exp(-0.5*(x*x)/(deta*deta)); } //計(jì)算當(dāng)前模板系數(shù) double BilateralWindow(double *window,int width,int height,double deta_d,double deta_r){double *mask=(double *)malloc(sizeof(double)*width*height);if(mask==NULL){printf("bilateral window malloc wrong\n");exit(0);}GaussianMask(mask,width,height,deta_d);double detavalue=0.0;double center_value=window[height/2*width+width/2];double k=0.0;double result=0.0;for(int j=0;j<height;j++){for(int i=0;i<width;i++){detavalue=center_value-window[j*width+i];mask[j*width+i]*=gaussian(detavalue,deta_r);k+=mask[j*width+i];}}for(int i=0;i<width*height;i++){result+=mask[i]*window[i];}free(mask);return result/k; } //雙邊濾波 void BilateralFilter(IplImage *src,IplImage *dst,int width,int height,double deta_d,double deta_r){double *window=(double *)malloc(sizeof(double)*width*height);for(int j=height/2;j<src->height-height/2;j++){for(int i=width/2;i<src->width-width/2;i++){for(int m=-height/2;m<height/2+1;m++){for(int n=-width/2;n<width/2+1;n++)window[(m+height/2)*width+n+width/2]=cvGetReal2D(src, j+m, i+n);}double value=BilateralWindow(window,width,height,deta_d,deta_r);cvSetReal2D(dst, j, i, value);}}free(window); }
觀察效果
? ? ?下面來(lái)觀察我們的效果,具體參數(shù)已經(jīng)標(biāo)在了圖像上:
? ? ? ?觀察結(jié)論:deta_d(距離標(biāo)準(zhǔn)差)越大會(huì)導(dǎo)致圖像更加模糊,因?yàn)槭褂酶咚购瘮?shù),deta_r(灰度標(biāo)準(zhǔn)差)越大會(huì)導(dǎo)致細(xì)節(jié)變得更模糊,所以可以根據(jù)3倍deta原則來(lái)選取合適的模板大小和deta大小,灰度差范圍-255到255,距離差范圍根據(jù)模板大小確定。
總結(jié)
? ??雙邊濾波,可以很好的保存邊緣并產(chǎn)生平滑效果,比高斯濾波和均值濾波效果更好,但計(jì)算量也更大 參考論文:
總結(jié)
以上是生活随笔為你收集整理的灰度图像--图像增强 双边滤波 Bilateral Filtering的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 双边滤波器在灰度和彩色图像处理中的应用
- 下一篇: 更新词汇至Unigram词表进行识别