灰度图像--图像增强 双边滤波 Bilateral Filtering
生活随笔
收集整理的這篇文章主要介紹了
灰度图像--图像增强 双边滤波 Bilateral Filtering
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
from:http://www.mamicode.com/info-detail-449413.html
開篇廢話
? ? ?廢話開始,話說昨天寫博客寫完了,發表以后居然刷出來的是空白,頓時很生氣,因為寫了一上午的東西瞬間就沒了,于是在微博上吐槽了csdn,于是csdn的官方微博和客服微博都跟我進行了溝通和道歉,感覺態度還是不錯的,作為用戶沒有付給他們錢,但還是受到了不小的重視,感覺還是不錯。學習是一個被分享之后經過自己加工后再分享的過程,一個分享的平臺是很重要的選擇,好的平臺能夠學到知識,并能分享知識,和別人討論知識,收集資源分享資源。希望大家共同進步。
? ? ? ?圖像增強,平滑第二天,雖然說是第二天,但要學習和研究包括寫程序,都不是一天完成的。上一篇寫的是線性濾波模板,此類模板我們可以叫他們靜態模板,因為其只依賴于我們的選擇,我們一旦選擇完成,模板就唯一確定,不會在卷積的過程中產生變換,所以這類模板具有線性性質,但缺點是不靈活,不能根據不同灰度變化情況來實時的調整權重,雙邊濾波就是一種非線性模板,能夠根據像素位置和灰度差值的不同產生不同的模板,得到不同的濾波結果。
基本思路
? ? ??雙邊濾波器是針對高斯平滑的提升版本,高斯平滑根據像素鄰域的距離決定權重,生成權重的函數為高斯函數,所以叫高斯平滑或者高斯濾波,效果是使圖像模糊,并一定程度上的保存邊緣,雙邊濾波的改進是增加了灰度值的影響,也就是鄰域的像素灰度值如果和中心像素的灰度值越接近,那么權值在高斯權值的基礎上在加上一個相對較大的權值,相反,如果灰度差很大,將會給已生成的高斯模板對應的位置加上一個小的權值,以此類推,并將模板系數歸一化(和為1,其目的是完全平滑的圖像結果不變),因此模板的系數不再單純的依賴位置關系,更依賴于灰度關系,因此邊緣將能夠被有效的保存。
數學基礎
? ? ??數學開始,數學公式可能看的比較難懂,但是懂了以后就會徹底理解整個算法,上面的描述只需要幾個公式就能準確的表示出來。 ? ? ? ?來看基礎版本的公式,這個公式通用均值濾波和高斯濾波:
? ? ? ?上式中:將上式中的積分腦補成求和,求和范圍是模板覆蓋的范圍,就代表模板的坐標位置(x,y),X就可以表示參數,比如高斯里的標準差參數。1/kd(x)為歸一化參數,保證絕對平滑的位置灰度值不變,c的選擇比較靈活,如果選擇高斯函數,那么就產生了高斯濾波模板。
上面是只利用位置(距離)產生模板系數的公式。下面我看一下只利用灰度信息產生一個模板(非線性):
f表示灰度分布,也就是模板內被覆蓋的灰度值,x(向量)代表原點位置,向量代表當前求和位置,同樣積分改成求和,求和區間為模板覆蓋的區間,同樣1/kr(x)是歸一化參數,保證平滑圖片的不變性。
? ? ? ?根據上面的描述,函數c只根據位置來平滑,平滑效果好,但邊緣保存弱,函數s只根據灰度差值產生模板,邊緣保存效果好,平滑效果差。 ? ? ? ?為了得到一個邊緣保持性好,同時平滑能力強的方法,我們決定將他們合體:
? ? ? 這個公式總和了上面兩種處理方法,同時根據距離和灰度差值產生模板系數,產生了一種新的非線性模板,歸一化的k計算如下:
? ? ? ?對于圖像,腦補成求和而不是積分,這個就是Bilateral Filter的形式,也就是說,c和s并沒有規定為高斯函數,如果你有更好的,可以自己開發,當然最一般的情況下,c和s我們選擇高斯函數: ? ? ? ?其中d表示距離,這里用歐氏距離來計算(歐氏距離就是初中學的最簡單的那個):? ? ? ? ?deta_d為距離的標準差,由我們手動決定,但要注意的是,標準差對于一個高斯函數來說,決定的是它的“胖瘦”,也就是圖形是寬還是窄,如果過窄,其中心權重接近1,其他權重會很小,極限情況下退化成沖擊,則只有中心位置元素,如果標準差選擇過大,高斯函數會過胖,也就是趨于一條直線,這時高斯平滑接近于均值,每個位置權重過于接近,并且,距離超過3倍的deta,那么權重也會很小,所以這個性質在我們選擇參數和后面觀察結果也是很有用的參考。 ? ? ? ?同理我們選擇高斯函數作為s函數:
? ? ? ? 式子中灰度差為:
? ? ? ?也就是模板內不同位置的灰度與中心灰度的差。 ? ? ? ?觀察下處理結果,英文不難,不再翻譯:
? ? ? ?來看原始論文的效果:
?主要觀察點在貓咪的胡須,看到即使右下角特別模糊的情況下,貓咪的胡須還是可以識別出來的。
代碼
? ? ?與前面文章同樣,代碼未經過優化,知識原始公式的翻譯,如果應用于工程,需要使用快速算法或將算法進行優化: //高斯函數 double gaussian(double x,double deta){return exp(-0.5*(x*x)/(deta*deta)); } //計算當前模板系數 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); }
觀察效果
? ? ?下面來觀察我們的效果,具體參數已經標在了圖像上:
? ? ? ?觀察結論:deta_d(距離標準差)越大會導致圖像更加模糊,因為使用高斯函數,deta_r(灰度標準差)越大會導致細節變得更模糊,所以可以根據3倍deta原則來選取合適的模板大小和deta大小,灰度差范圍-255到255,距離差范圍根據模板大小確定。
總結
? ??雙邊濾波,可以很好的保存邊緣并產生平滑效果,比高斯濾波和均值濾波效果更好,但計算量也更大 參考論文:
總結
以上是生活随笔為你收集整理的灰度图像--图像增强 双边滤波 Bilateral Filtering的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双边滤波器在灰度和彩色图像处理中的应用
- 下一篇: 更新词汇至Unigram词表进行识别