這篇文章將為大家詳細講解有關(guān)引導(dǎo)圖濾波原理以及OpenCV實現(xiàn)是怎樣的,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
成都創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的沁陽網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
引導(dǎo)圖濾波器是一種自適應(yīng)權(quán)重濾波器,能夠在平滑圖像的同時起到保持邊界的作用。這里只說一下自適應(yīng)權(quán)重原理、C++實現(xiàn)灰度圖像以及彩色圖像的引導(dǎo)圖濾波、驗證結(jié)果。
自適應(yīng)權(quán)重原理
引導(dǎo)圖濾波作為一種線性濾波器,可以簡單定義為如下形式:
其中I是引導(dǎo)圖像(guided Image),P是輸入的待濾波圖像,Q是濾波后的輸出圖像,W是根據(jù)引導(dǎo)圖I確定的權(quán)重值。權(quán)重值W可以用下式表示(原文獻有詳細推導(dǎo)):
μk是窗口內(nèi)像素點的均值,Ii和Ij指相鄰兩個像素點的值,σk代表窗口內(nèi)像素點的方差,ε是一個懲罰值。自適應(yīng)權(quán)重可以根據(jù)上式分析得到:Ii和Ij在邊界兩側(cè)時,(Ii-μk)和(Ij-μk)異號,否則,則同號。而異號時的權(quán)重值將遠遠小于同號時的權(quán)重值,這樣處于平坦區(qū)域的像素則會被加以較大的權(quán)重,平滑效果效果更明顯,而處于邊界兩側(cè)的像素則會被加以較小的權(quán)重,平滑效果較弱,能夠起到保持邊界的效果。
懲罰值ε對濾波效果影響也很大,當ε值很小時,濾波如前面所述;當ε值很大時,權(quán)重的計算公式將近似為一個均值濾波器,平滑效果會更明顯。
同樣也可以根據(jù)線性濾波公式來看引導(dǎo)圖濾波的自適應(yīng)權(quán)重原理,局部線性濾波模型公式如下:
I指引導(dǎo)圖像,Q是輸出圖像,ak和bk兩個系數(shù)根據(jù)引導(dǎo)圖I和輸入圖像P共同決定。將上式兩邊求梯度,可以得到▽q=a*▽I,即輸出圖像的梯度信息完全由引導(dǎo)圖像的梯度信息決定,當引導(dǎo)圖中有邊界時,輸出圖像中對應(yīng)位置也會有邊界。而a和b的值將會決定梯度信息和平滑信息的權(quán)重大小。
通過觀察a和b的公式,a的分子為I和P的協(xié)方差,分母部分為I的方差加上截斷值ε;b的值為P的均值減去a乘以I的均值??梢钥闯霎攁值很小時,b約等于窗口內(nèi)像素點的均值pk,近似于均值濾波;而當a值很大時,輸出則主要取決于a*▽I的大小,梯度信息能夠得到保留。
C++實現(xiàn)灰度圖像以及彩色圖像的引導(dǎo)圖濾波
根據(jù)原文獻中提供的偽代碼,不難用C++實現(xiàn)引導(dǎo)圖濾波算法。偽代碼如下:
不同之處在于求a時將原來的方差σ替換為協(xié)方差3x3矩陣∑k,表示如下:
U是3x3單位矩陣,求出來的a將不再是一個值,而是一個1*3的向量,然后求b。a為1*3的向量,μk為3*1的向量,相乘后b為一常量,由此可以求得常量b的值。
這里又分為兩種情況:
①輸入圖為單通道:按照上述步驟計算即可。
②輸入圖為三通道:先分離三個通道,對每個通道進行上述濾波操作,然后合并通道即可。
注:引導(dǎo)圖為彩色圖比引導(dǎo)圖為灰度圖,邊界保護更加明顯,見原文。
效果驗證
代碼里面求均值部分,可以由OpenCV中的boxFilter()函數(shù)實現(xiàn),或者blur()函數(shù)實現(xiàn)??傊且粋€均值濾波器,之所以與窗口大小無關(guān),是因為使用直方圖實現(xiàn)的均值濾波,能夠大大降低運算時間。VS2015+OpenCV3.4.0實現(xiàn)的代碼放在我的碼云code上:https://gitee.com/rxdj/guidedFilter.git。
主要輸入?yún)?shù)就是引導(dǎo)圖I,輸入圖P,窗口半徑r,截斷值ε,輸出參數(shù)為濾波后圖像Q。引導(dǎo)圖I和輸入圖像P可以相同,也可以不同,比如stereo matching中常常用原參考圖像作為引導(dǎo)圖,對代價空間圖進行引導(dǎo)圖濾波以實現(xiàn)代價聚合。這樣能盡量保留原圖像邊界區(qū)域的匹配代價,而平滑平坦區(qū)域的匹配代價。
(注:文獻中的代碼是通過matlab編寫的,matlab中讀取圖像時會自動將圖像歸一化到0-1,因此截斷值ε的設(shè)置也對應(yīng)小很多,比如0.1,0.01等。而本文中讀取圖像后未進行歸一化操作,所以截斷值ε的設(shè)置會有不同。如果需要歸一化,則自行讀取圖像后除以255即可)。
單通道灰度圖原圖
改變截斷值ε
r=10, ε=0 r=10, ε=100
r=10 , ε=2000 r=10, ε=8000
改變窗口半徑r
r=0, ε=500 r=5, ε=500
r=10, ε=500 r=20, ε=500
三通道彩色圖
原圖
快速引導(dǎo)圖濾波算法
快速引導(dǎo)圖濾波算法見。快速的地方主要是采用了圖像金字塔思想。步驟如下:
對引導(dǎo)圖像I和輸入圖像P進行1/s的降采樣,得到I', P';
利用I'和P'計算系數(shù)a和b,并計算輸出圖像Q';
將Q'進行s倍的上采樣得到最終輸出圖像Q。
由于計算部分是降采樣的圖像,運算量會大大減小,而不會引入明顯的失真,因此成為快速引導(dǎo)圖濾波。代碼見上述碼云code鏈接的fastGuidedFilter分支。
關(guān)于引導(dǎo)圖濾波原理以及OpenCV實現(xiàn)是怎樣的就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。