基本介紹
技術簡介,計算公式,套用,代碼實現,
技術簡介
導向圖濾波是一種圖像濾波技術,通過一張引導圖G(導向圖),對目標圖像P(輸入圖像)進行濾波處理,使得最後的輸出圖像大體上與目標圖像P相似,但是紋理部分與引導圖G相似。其典型套用有兩個:保邊圖像平滑,摳圖。
計算公式
記引導圖(導向圖)為G,輸入圖像為P,輸出圖像為Q,導向圖濾波的目標就是使得原始的輸入和輸出儘可能相同,同時紋理部分與引導圖G相似。
對於目標1:輸入圖像P和輸出圖像Q儘可能相似,可以用公式描述為:
![](/img/5/3d7/0b4438c74f320fd332e62dcd5e1a.jpg)
對於目標2:輸出圖像Q的紋理和引導圖G儘可能相似,用公式描述為:
![](/img/b/a1b/cc7a8398d16282c1bc30671148e2.jpg)
上式中如果Q為單通道圖像,G為多通道,那么a為一個向量;如果Q和G通道數相同,那么a為標量或者對角矩陣。顯然,a的值越小,最後的輸出圖像也就越平滑。
對於目標2,可以對等式兩邊取定積分,從而得到:
![](/img/4/bcc/37057e62399b802227e3a9eac97f.jpg)
下面就導向圖G和輸入圖P分兩種情況進行討論。
![導向圖濾波 導向圖濾波](/img/b/150/nBnaugDZiNDNmVGMiFjMkVWMhdDNkNmZykzNmZ2M0QGO4YDZ1QjM5MDMkZ2LptWa39yYpB3LltWahJ2Lt92YuUHZpFmYuMmczdWbp9yL6MHc0RHa.jpg)
1. G為3通道,P為單通道
由於上式只是一個局部線性模型,因此兩個係數其實是一個與位置有關的變數。為了確定其值,考慮一個小視窗
,使得視窗內的像素同時滿足上面兩個條件,可以將上式帶入第一個式子中得到目標函式(為了防止a過大,添加了一個懲罰項):
![](/img/e/265/f165844fd66958a8c435cebdefdd.jpg)
![](/img/a/f36/d1db4c86a5fa6f8fe57a1a1d66c6.jpg)
對兩個參數求偏導數得到:
![](/img/e/4f9/b937faedd8552ab446e411357075.jpg)
![](/img/1/7e3/5d19517e65f09704ab9aa69d68ed.jpg)
由此可以解得:
![](/img/8/23c/6a75774316ed57148094458bd332.jpg)
![](/img/7/672/de176e355902a2b0858c875444dc.jpg)
上式取平均值操作都是在對應的視窗
中進行的。
![](/img/1/b5f/8a2c467abb4d6d0d3da148d80ba9.jpg)
2. G和P通道數相同
對於G和P通道數相同的情形,只需要考慮二者均為單通道的情況即可,多通道的情況可以分別進行單通道處理。具體過程與上面的類似,這裡直接給出最後的結果:
![](/img/1/b7f/6ec9a9a6bbfe38b07e4e6b788949.jpg)
![](/img/a/7bd/fe47a2011993004159f9a1ae0503.jpg)
套用
1. 保邊圖像平滑
當引導圖G與輸入圖P為同一個圖像的時候,導向圖濾波的效果與雙邊濾波的效果類似,但是不同於雙邊濾波的是,導向圖濾波可以很容易設計一個與濾波半徑無關的最佳化算法。其中視窗半徑為平滑半徑,參數
為平滑項參數,其值越大平滑的越明顯。
![](/img/c/b52/aac8f23db43e9124706a7ac37456.jpg)
![導向圖濾波 導向圖濾波](/img/5/0fd/nBnauQzM2EGZyUjM5UDM2EmMwQmZlFDO2Q2YiNGNhFDOmJWZ0QzN4MzMkBzLptWa39yYpB3LltWahJ2Lt92YuUHZpFmYuMmczdWbp9yL6MHc0RHa.jpg)
![導向圖濾波 導向圖濾波](/img/8/b71/nBnauYDZjNDZmdjYiRWOzI2Y2gzYjlDM4MTYhVmNkFWNkJWM0YWZwIWMzQ2LptWa39yYpB3LltWahJ2Lt92YuUHZpFmYuMmczdWbp9yL6MHc0RHa.jpg)
2. 摳圖
當輸入圖P為一個初始的mask圖像時,導向圖濾波的效果類似於摳圖算法,其中視窗半徑為摳圖的半徑,參數
為平滑項。
![](/img/a/c13/e4261b7800bf9306d9c64c155626.jpg)
![導向圖濾波 導向圖濾波](/img/b/bfe/nBnaucDOzMjN2ITNkZmNiJGZlNDZkRGZ3YWNyQzYkRWZ2QWY1QmYxQjZmBzLptWa39yYpB3LltWahJ2Lt92YuUHZpFmYuMmczdWbp9yL6MHc0RHa.jpg)
![導向圖濾波 導向圖濾波](/img/c/1d5/nBnauM2NlFTMzkzNzMmZhZzMwYmNlRjMkVmM5QjNiFGZlJmZiZmY0YGM1E2LptWa39yYpB3LltWahJ2Lt92YuUHZpFmYuMmczdWbp9yL6MHc0RHa.jpg)
![導向圖濾波 導向圖濾波](/img/1/b89/nBnauM2YmJWZjRTMhVWOjVjYjVDZyYWNhZDNjRzM4ITYyQDZkJTNykTNxYzLptWa39yYpB3LltWahJ2Lt92YuUHZpFmYuMmczdWbp9yL6MHc0RHa.jpg)
![導向圖濾波 導向圖濾波](/img/e/a9b/nBnauUGMllTOkN2NjN2MhRGZ5ITOiN2YygjN0kDM2cjZlJ2YkFWMzQjZkBzLptWa39yYpB3LltWahJ2Lt92YuUHZpFmYuMmczdWbp9yL6MHc0RHa.jpg)
代碼實現
不難看出,導向圖濾波的主要步驟就兩個,計算每個公式中的各種平均值,然後根據平均值計算出
和
,最後根據
得到輸出圖像。
![](/img/e/cbe/ea374f0daf0bc436d9ab765157fb.jpg)
![](/img/6/c77/910fdc68dafc0d06f746490f54be.jpg)
![](/img/e/2a1/a20e72e54ddcf3ae41cbce598999.jpg)
計算平均值可以通過積分圖高效的實現,matlab代碼如下:
矩形濾波代碼(計算視窗平均值)
function imDst = boxfilter(imSrc, r)% BOXFILTER O(1) time box filtering using cumulative sum%% - Definition imDst(x, y)=sum(sum(imSrc(x-r:x+r,y-r:y+r)));% - Running time independent of r; % - Equivalent to the function: colfilt(imSrc, [2*r+1, 2*r+1], 'sliding', @sum);% - But much faster.[hei, wid] = size(imSrc);imDst = zeros(size(imSrc));%cumulative sum over Y axisimCum = cumsum(imSrc, 1);%difference over Y axisimDst(1:r+1, :) = imCum(1+r:2*r+1, :);imDst(r+2:hei-r, :) = imCum(2*r+2:hei, :) - imCum(1:hei-2*r-1, :);imDst(hei-r+1:hei, :) = repmat(imCum(hei, :), [r, 1]) - imCum(hei-2*r:hei-r-1, :);%cumulative sum over X axisimCum = cumsum(imDst, 2);%difference over Y axisimDst(:, 1:r+1) = imCum(:, 1+r:2*r+1);imDst(:, r+2:wid-r) = imCum(:, 2*r+2:wid) - imCum(:, 1:wid-2*r-1);imDst(:, wid-r+1:wid) = repmat(imCum(:, wid), [1, r]) - imCum(:, wid-2*r:wid-r-1);end