導向濾波的原理以及其應用

Guided Filter

黃琮耀
黃琮耀
Oct 15 · 6 min read
Left : Original photo by Phil Hall, Right : Guided filtered photo with r = 6, ϵ = 0.05²

在影像處理中,我們常常會需要用到平滑化 (smoothing)來達成影像中雜訊的濾除。而最基本的平滑化方法有 Box filter,此濾波器單純就是對於每個像素,取其周圍 (window) 所有像素的平均作為輸出,這樣就可以把高頻的雜訊抹除掉。常見的還有 Gaussian filter (對周圍像素做鐘型權重的加權平均)。

Box filter 和 Gaussian filter 都是把每個像素的周圍做平均/加權平均,成為輸出的像素值

然而,上述這兩種平滑化方式都有一個嚴重的問題,就是無論影像中高頻的訊號,不論是否為雜訊都會被抹除。一幅影像,通常會有平緩的區域 (例如衣服上的某色塊區),和較為尖銳的 (例如邊角、輪廓、紋理細節)區域組成。平緩的區域我們可以歸類成低頻訊號,至於邊角、輪廓等梯度較大的區域則屬於高頻訊號。所以一幅經過 Box filter或是 Gaussian filter 處理過的影像,通常會因為失去輪廓及細節,導致看起來很模糊,而這是我們不希望看到的。

為了解決這個問題,很多學者提出了保留邊角 (Edge-preserving) 的濾波器,著名的有 Bilateral filter、Median filter、Wiener filter 等。本篇文章將介紹文獻中提出的另外一種濾波器 — 導向濾波 (Guided filter),它除了在保留邊緣的效果相當優秀以外,還有其他多種用途,例如影像除霧 (Dehaze)、上採樣 (Upsampling),細節強化。

Guided Filter 原理

導向濾波的名字由來,在於其演算法中,對於一張輸入圖p,我們還額外需要提供另一張引導圖 I,才有辦法做濾波(當然引導圖也可以是同一張輸入圖),其架構示意圖如下:

注意到圖的下半部分,導向濾波首先假設輸出圖 q 與引導圖 I 之間有局部線性的關係,而輸出圖 q 同時也等同輸入圖 p 去除雜訊 n 後的結果。因此我們可以得到一組聯立方程式,考慮無約束的影像還原方法,我們把雜訊與其他變數分別置於等號兩邊,目標最小化 n² 並施加正則化 (Regularization),得到 a 與 b 在window k 中的最小平方式:

而其解為:

其中,aₖ的分子為 I 與 p 對應座標 window的共變異數 (covariance),分母為 I 影像中各座標 windows 的變異數。

我們可以進一步把這個結果流程化如下圖, fₘₑₐₙ 為半徑 r ,實際 window 大小為 (2r + 1) * (2r + 1)的 Box filter。

Guided Filter Python實作

使用 OpenCV 框架做好影像讀寫後,把演算法照流程刻上去即可。實作上需注意的是 imread() 讀入的資料型態為 uint8, 也就是像素的值域會從 [0, 1) 拉伸到整數域的 [0, 256),這麼一來如果對像素進行乘法和除法,都會導致值域的偏移和溢位 (overflow),處理起來相對麻煩。因此讀入後先轉成 float 處理,做完運算後再轉回 uint8 做輸出。

我們實際輸出欲求的 a 以及 b 權重圖,可以發現 a 萃取原圖的輪廓以及細節,而 b 保留著大致的背景色彩。

左圖 : a, 右圖: b

進一步把輸出放大來看,發現 window 半徑 r 和正則項 ϵ,分別影響輸出的模糊範圍及模糊程度,不過即使在很大程度的模糊中,也仍然能在圖片中看出 導向濾波對細節(圖中睫毛、頭髮)的保留。

r, ϵ 對於輸出結果的影響

Guided Filter 在深度學習中的應用

除了作為 Edge-preserving 的平滑化濾波器使用之外,我們還能將導向濾波作為 upsampling 的工具使用。在影像領域的機械學習中,我們常使用卷積神經網路 (CNN) 模型做訓練,而此類模型因計算量非常龐大,輸入影像的大小多半侷限在百萬像素內 (常見的有224x224, 256x256, 640x512等)。如果要對大型影像作處理,導向濾波則可以派上用場,流程如下圖。

在圖中我們可以看到,對於大型影像 Iₕ 選擇不直接丟入 CNN 做訓練,而是先將其降至低解析度影像 Iₗ 後再做訓練。透過將神經網路處理後的低解析度輸出 Oₗ 和 Iₗ 做引導濾波,得出低解析度的 a 與 b。接著將 a 與 b 做 upsampling 以後對原始的高解析引像做線性轉換,就可以得到高解析度的輸出影像 Oₕ。

導向濾波由於整個流程都是線性的,所以甚至在深度學習中可以作為一個層 (layer)使用,並求出梯度進而反向傳播 (Back Propagation)。

如此一來,我們可以只使用低解析度的影像送入神經網路,而得到差不多效果的高解析輸出,可大幅加速訓練速度。

Taiwan AI Academy

news, tech reviews and supplemental materials

黃琮耀

Written by

黃琮耀

Taiwan AI Academy

news, tech reviews and supplemental materials

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade