[PAMI2013] Guided Image Filtering 导向滤波器以及OpenCV-Python代码实现
論文地址:https://www.researchgate.net/profile/Xiaoou_Tang/publication/236228168_Guided_Image_Filtering/links/54e999640cf27a6de1103c64.pdf
He, K. , J. Sun , and X. Tang . “Guided Image Filtering.” IEEE Transactions on Pattern Analysis & Machine Intelligence 2013:1397-1409.
摘要:在本文中,我們提出了一種新型的顯式圖像濾波器-引導(dǎo)濾波器。該引導(dǎo)濾波器由局部線性模型推導(dǎo)而來,通過考慮引導(dǎo)圖像的內(nèi)容來生成濾波輸出,引導(dǎo)圖像可以是輸入圖像本身,也可以是另一幅不同的圖像。引導(dǎo)濾波器可以像常用的雙邊濾波器一樣作為保持邊緣的平滑算子,但是在邊緣附近有更好的行為。它與消光拉普拉斯矩陣也有理論聯(lián)系,是比平滑算子更通用的概念,可以更好地利用制導(dǎo)圖像中的結(jié)構(gòu)。此外,該導(dǎo)引濾波器具有快速的非近似線性時(shí)間算法,其計(jì)算復(fù)雜度與濾波核的大小無關(guān)。我們證明了引導(dǎo)濾波器在很多計(jì)算機(jī)視覺和計(jì)算機(jī)圖形應(yīng)用中都是有效的,包括降噪,細(xì)節(jié)平滑/增強(qiáng)、HDR壓縮、圖像摳圖/羽化、去霧和聯(lián)合上采樣。
Guided Image Filtering
- 引導(dǎo)濾波定義
- 引導(dǎo)濾波與其他方向相比優(yōu)勢所在
- 引導(dǎo)濾波的主要特點(diǎn)及應(yīng)用
- 引導(dǎo)濾波的算法原理
- OpenCV-Python代碼實(shí)現(xiàn)
- 參考資料
引導(dǎo)濾波定義
即需要引導(dǎo)圖的濾波器,引導(dǎo)圖可以是單獨(dú)的圖像或者是輸入圖像,當(dāng)引導(dǎo)圖為輸入圖像時(shí),引導(dǎo)濾波就成為一個(gè)保持邊緣的濾波操作,可以用于圖像重建的濾波。
引導(dǎo)濾波與其他方向相比優(yōu)勢所在
像高斯濾波等線性濾波算法所用的核函數(shù)相對于待處理的圖像是獨(dú)立無關(guān)的,也就意味著,對任意圖像都是采用相同的操作。但是,有時(shí)候我們是希望在濾波過程中可以加入引導(dǎo)圖像中的信息的,例如,在上色處理過程中,結(jié)果圖像的色度通道需要包含跟給定亮度通道一致的連續(xù)邊緣。
引導(dǎo)濾波的主要特點(diǎn)及應(yīng)用
1、引導(dǎo)濾波(導(dǎo)向?yàn)V波)是一種圖像濾波技術(shù),通過一張引導(dǎo)圖I,對初始圖像p(輸入圖像)進(jìn)行濾波處理,使得最后的輸出圖像大體上與初始圖像P相似,但是紋理部分與引導(dǎo)圖I相似。其典型應(yīng)用有兩個(gè):保邊圖像平滑,摳圖。
2、 引導(dǎo)濾波(導(dǎo)向?yàn)V波)的目的是,保持雙邊濾波的優(yōu)勢(有效保持邊緣,非迭代計(jì)算),而克服雙邊濾波的缺點(diǎn)(設(shè)計(jì)一種時(shí)間復(fù)雜度為 O(1) 的快速濾波器,而且在主要邊緣附近沒有梯度的變形)。
3、 引導(dǎo)濾波(導(dǎo)向?yàn)V波)不僅能實(shí)現(xiàn)雙邊濾波的邊緣平滑,而且在檢測到邊緣附近有很好的表現(xiàn),可應(yīng)用在圖像增強(qiáng)、HDR壓縮、圖像摳圖及圖像去霧等場景。
引導(dǎo)濾波的算法原理
從圖中也可以看出,導(dǎo)向?yàn)V波的輸入為兩個(gè),一個(gè)是真實(shí)的輸入p,另一個(gè)是引導(dǎo)輸入I。輸出為q,是p和I共同作用的產(chǎn)物。
噪聲和邊緣的區(qū)別,噪聲一般周圍的像素梯度變化較大,并且以其為中心,向四周的梯度大體相似。而邊緣出現(xiàn)了梯度的階躍,并且梯度最大的方向在邊緣的法線方向,其他方向遠(yuǎn)離法線方向逐漸變小。一般的濾波無法區(qū)分噪聲和邊緣,于是對其統(tǒng)一處理,因此很多情況下,濾波的同時(shí),邊緣也被處理模糊了。
引導(dǎo)濾波算法也屬于可以保持邊緣的一種濾波算法。導(dǎo)向?yàn)V波之所以叫這個(gè)名字,大概是因?yàn)樗惴ㄔ谶M(jìn)行濾波時(shí)需要一幅引導(dǎo)圖像,引導(dǎo)圖像可以是另外單獨(dú)的圖像,也可以是輸入圖像本身,當(dāng)引導(dǎo)圖為輸入圖像本身時(shí),引導(dǎo)濾波就成為一個(gè)保持邊緣的濾波操作。引導(dǎo)濾波可以用于降噪、細(xì)節(jié)平滑、HDR壓縮、摳圖、去霧以及聯(lián)合采樣等方面。
相關(guān)算法比較:
像高斯濾波等線性濾波算法所用的核函數(shù)相對于待處理的圖像是獨(dú)立無關(guān)的,也就意味著,對任意圖像都是采用相同的操作。但是,有時(shí)候我們是希望在濾波過程中可以加入引導(dǎo)圖像中的信息的,例如,在上色處理過程中[2],結(jié)果圖像的色度通道需要包含跟給定亮度通道一致的連續(xù)邊緣。
方式1:通過引導(dǎo)圖像獲得約束條件,轉(zhuǎn)化為非齊次方程的求解問題,此方法設(shè)計(jì)到大型稀疏方程求解,所以會(huì)比較耗時(shí)。
方式2:直接利用引導(dǎo)圖像得到濾波核函數(shù)。例如在之前說的雙邊濾波[3]中,在某像素點(diǎn)的輸出為周邊像素與該點(diǎn)相似度相關(guān)的權(quán)重和,只是雙邊濾波所用的引導(dǎo)圖像是它本身;另外,在[4]中,引導(dǎo)圖像則是另外一幅圖像。
當(dāng)然這些方法也有缺點(diǎn):一是可能引入梯度反轉(zhuǎn)偽影,二是計(jì)算量的快速優(yōu)化難度。在[5]中,作者證明了雙邊濾波可以是一種解決高斯親和矩陣時(shí)的雅克比插值,這就比原始優(yōu)化方法在速度上要優(yōu)化不少;針對這些缺點(diǎn),引導(dǎo)濾波算法做出了改進(jìn)。
OpenCV-Python代碼實(shí)現(xiàn)
# -*- coding: utf-8 -*-import cv2 import numpy as npsrc_img_path = 'src_img.jpg' guided_img_path = 'guided_img.jpg'def my_guidedFilter_oneChannel(srcImg, guidedImg, rad=9, eps=0.01):srcImg = srcImg / 255.0guidedImg = guidedImg / 255.0img_shape = np.shape(srcImg)P_mean = cv2.boxFilter(srcImg, -1, (rad, rad), normalize=True)I_mean = cv2.boxFilter(guidedImg, -1, (rad, rad), normalize=True)I_square_mean = cv2.boxFilter(np.multiply(guidedImg, guidedImg), -1, (rad, rad), normalize=True)I_mul_P_mean = cv2.boxFilter(np.multiply(srcImg, guidedImg), -1, (rad, rad), normalize=True)var_I = I_square_mean - np.multiply(I_mean, I_mean)cov_I_P = I_mul_P_mean - np.multiply(I_mean, P_mean)a = cov_I_P / (var_I + eps)b = P_mean - np.multiply(a, I_mean)a_mean = cv2.boxFilter(a, -1, (rad, rad), normalize=True)b_mean = cv2.boxFilter(b, -1, (rad, rad), normalize=True)dstImg = np.multiply(a_mean, guidedImg) + b_meanreturn dstImg * 255.0def my_guidedFilter_threeChannel(srcImg, guidedImg, rad=9, eps=0.01):img_shape = np.shape(srcImg)dstImg = np.zeros(img_shape, dtype=float)for ind in range(0, img_shape[2]):dstImg[:, :, ind] = my_guidedFilter_oneChannel(srcImg[:, :, ind],guidedImg[:, :, ind], rad, eps)dstImg = dstImg.astype(np.uint8)return dstImgdef main():src_img = cv2.imread(src_img_path)guided_img = cv2.imread(guided_img_path)print(np.shape(src_img))print(np.shape(guided_img))dstimg = my_guidedFilter_threeChannel(src_img, guided_img, 9, 0.01)print(np.shape(dstimg))cv2.imwrite('output.jpg', dstimg)cv2.imshow('output', dstimg)cv2.waitKey(0)if __name__ == '__main__':main()import matplotlib.pyplot as pltsrc_img = plt.imread(src_img_path)guided_img = plt.imread(guided_img_path)output_img = plt.imread('output.jpg')plt.subplot(131)plt.imshow(src_img)plt.axis('off')plt.title('src')plt.subplot(132)plt.imshow(guided_img)plt.axis('off')plt.title('guided')plt.subplot(133)plt.imshow(output_img)plt.axis('off')plt.title('output')plt.show()參考資料
總結(jié)
以上是生活随笔為你收集整理的[PAMI2013] Guided Image Filtering 导向滤波器以及OpenCV-Python代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyTorch项目使用Tensorboa
- 下一篇: python all()函数