基於加權最小二乘法的保邊緣平滑濾波器(WLS)

引言

陸陸續續在計算攝影學接觸了不少保邊濾波器,其重要性自不必說,可以用在圖像的增強,圖像抽象畫,高動態範圍圖像壓縮,圖像色調映射等。
這裏寫圖片描述
今天介紹的WLS(最小二乘濾波器)即使其中一種,論文全稱《Edge-Preserving Decompositions for Multi-Scale Tone and Detail Manipulation》,作者Z. Farbman等,發表在ACM SIGGRAPH 2007。
這篇文章是基於最優化理論,代碼是公開,點此下載。當然有更好的濾波器不斷出現。但是這篇文章核心代碼只有十幾行左右,數學功底深厚,方法比較去值得研究和學習之用。這篇文章只是我看此論文一個筆錄,不正確之處歡迎指正。

算法

設計一個保邊濾波器可以看做是兩個矛盾的目標的結合體。對於一副輸入圖像g ,我們目標圖像u 一方面我們希望其儘可能近似g ,與此同時u 除了在g 一些邊緣梯度變化比較大的地方外應該越平滑越好。形式上,我們尋求最小化下列目標函數的解。

p((upgp)2+λ(ax,p(g)(ux)2)+ay,p(g)(uy)2))(1)

這裏,下標p 代表像素點空間位置。目標函數第一項(upgp)2 代表輸入圖像u 和輸出圖像g 越相似越好,第二項是正則項,通過最小化u 的偏導,使得輸出圖像g 越平滑越好。平滑項的權重分別是axay ,依賴於輸入圖像g ,想想也是這樣的嘛,當輸入圖像的邊緣梯度變化比較大的時候,我們希望其約束小一些,以保留圖像的結構信息,當圖像的邊緣梯度變化很小的時候,這些細節信息我們認爲其不重要,約束自然可以大一些,λ 是正則項參數,平衡兩者比重,λ 越大圖像也就越平滑。
將上式寫成矩陣形式(因爲矩陣比較清晰簡潔,很好用的工具,^_^):
(ug)T(ug)+λ(uTDTxAxDxu+uTDTyAyDyu)(2)

這裏,AxAy 是包含平滑權重ax(g),ay(g) 的對角矩陣,一會兒我們將看到其是輸入圖像g 梯度的函數。DxDy 是離散差分算子。
這裏ug 都會轉換成向量形式,對上式求導(比較簡單的一步)可得到下列線性方程組,
(I+λLg)u=g(3)

這裏Lg=DTxAxDx+DTyAyDy
還有平滑項權重的設置,作者如下定義
ax,p(g)=(|lx(p)|α+ε)1(4)

ay,p(g)=(|ly(p)|α+ε)1(5)

l 是輸入圖像亮度通道的log值(其實直接用原始圖像也是可行的),可以看出當l 的梯度比較大時,ax,p(g),ay,p(g) 會隨着變小,否則反之。權重的這樣設計是很合理的,可以保留較大的邊緣,平滑不必要的細節。
注意到DxDy 是前向算子(forward difference operators),DTxDTy 是後向差分算子(backward difference opeattors)。那就是我們的Lg 是一個五點空間異性拉普拉斯矩陣(five-point spatially inhomogeneous Laplacian
matrix
)。簡單解釋一下異性,異性因爲LgAx 是個變量,隨空間位置改變。若它是一個常數,即隨空間位置不變,那麼這樣的矩陣就稱爲五點空間同性拉普拉斯矩陣。更多內容可以參考《Efficient Preconditioning of Laplacian Matrices for Computer Graphics》一文,裏面介紹了比較多的拉普拉斯矩陣的數學基礎和應用。
這個算法的核心還是生成拉普拉斯這個矩陣。
先準備一下數據,一會兒再來填充一下這個矩陣。
第一步根據圖像l 的梯度值計算相鄰像素之間的平滑權重:
% Compute affinities between adjacent pixels based on gradients of L
dy = diff(L, 1, 1);
dy = -lambda./(abs(dy).^alpha + smallNum);
dy = padarray(dy, [1 0], 'post');
dy = dy(:);

dx = diff(L, 1, 2); 
dx = -lambda./(abs(dx).^alpha + smallNum);
dx = padarray(dx, [0 1], 'post');
dx = dx(:);

這一步基本上就是按照公式(4)(5)編寫的,只是lambda前面多了一個負號,dxdy 一會兒將被填充到非主對角線位置,這些元素都是爲負的。
接下來就是構造拉普拉斯矩陣了,這裏的拉普拉斯是一個對稱,只有少數幾個對角線有元素,其餘爲零的稀疏矩陣。

% Construct a five-point spatially inhomogeneous Laplacian matrix
B(:,1) = dx;
B(:,2) = dy;
d = [-r,-1];
A = spdiags(B,d,k,k);

e = dx;
w = padarray(dx, r, 'pre'); w = w(1:end-r);
s = dy;
n = padarray(dy, 1, 'pre'); n = n(1:end-1);

D = 1-(e+w+s+n);
A = A + A' + spdiags(D, 0, k, k);

這裏A+A 構造的是拉普拉斯的非主對角線元素,D 是主對角線元素。n,s,w,e 是上(北)下(南)左(西)右(東)四個方位。
看最終生成的一副拉普拉斯矩陣圖吧。
這裏寫圖片描述
這張圖中可以看出每一行元素之和都爲0。其中緊靠主對角線元素的兩個對角線填充的是dy 元素,比較遠的對角線填充的是dx 元素,這樣拉普拉斯矩陣處理的就是二維圖像了。
完整的代碼如下:

function OUT = wlsFilter(IN, lambda, alpha, L)
%WLSFILTER Edge-preserving smoothing based on the weighted least squares(WLS) 
%   optimization framework, as described in Farbman, Fattal, Lischinski, and
%   Szeliski, "Edge-Preserving Decompositions for Multi-Scale Tone and Detail
%   Manipulation", ACM Transactions on Graphics, 27(3), August 2008.
%
%   Given an input image IN, we seek a new image OUT, which, on the one hand,
%   is as close as possible to IN, and, at the same time, is as smooth as
%   possible everywhere, except across significant gradients in L.
%
%
%   Input arguments:
%   ----------------
%     IN              Input image (2-D, double, N-by-M matrix). 
%       
%     lambda          Balances between the data term and the smoothness
%                     term. Increasing lambda will produce smoother images.
%                     Default value is 1.0
%       
%     alpha           Gives a degree of control over the affinities by non-
%                     lineary scaling the gradients. Increasing alpha will
%                     result in sharper preserved edges. Default value: 1.2
%       
%     L               Source image for the affinity matrix. Same dimensions
%                     as the input image IN. Default: log(IN)
% 
%
%   Example 
%   -------
%     RGB = imread('peppers.png'); 
%     I = double(rgb2gray(RGB));
%     I = I./max(I(:));
%     res = wlsFilter(I, 0.5);
%     figure, imshow(I), figure, imshow(res)
%     res = wlsFilter(I, 2, 2);
%     figure, imshow(res)

if(~exist('L', 'var')),
    L = log(IN+eps);
end

if(~exist('alpha', 'var')),
    alpha = 1.2;
end

if(~exist('lambda', 'var')),
    lambda = 1;
end

smallNum = 0.0001;

[r,c] = size(IN);
k = r*c;

% Compute affinities between adjacent pixels based on gradients of L
dy = diff(L, 1, 1);
dy = -lambda./(abs(dy).^alpha + smallNum);
dy = padarray(dy, [1 0], 'post');
dy = dy(:); %公式(5)

dx = diff(L, 1, 2); 
dx = -lambda./(abs(dx).^alpha + smallNum);
dx = padarray(dx, [0 1], 'post');
dx = dx(:); %公式(4)


% Construct a five-point spatially inhomogeneous Laplacian matrix
B(:,1) = dx;
B(:,2) = dy;
d = [-r,-1];
A = spdiags(B,d,k,k);

%構造主對角線
e = dx;
w = padarray(dx, r, 'pre'); w = w(1:end-r);
s = dy;
n = padarray(dy, 1, 'pre'); n = n(1:end-1);

D = 1-(e+w+s+n); %再加上單位矩陣,這裏元素都爲負數,先取反
A = A + A' + spdiags(D, 0, k, k); %A+A'爲非主對角線元素

% Solve
OUT = A\IN(:); %公式(3)
OUT = reshape(OUT, r, c);%轉換爲矩陣

算法介紹完畢,關於其應用可以參考論文的主頁,見末尾。

關於拉普拉斯矩陣

拉普拉斯矩陣在計算機圖形和計算攝影學經常會遇到的,比如說灰度圖像着色問題泊松圖像編輯HDR,還有保邊濾波器的設計,當然在計算機圖形學中的也有諸多應用,所以掌握其解法還是非常有必要的。
它經常會出現在如下的最優化問題當中

F(x)=iI[ui(xiyi)2+jNiwij(xixjzij)2]

第一項是數據項,度量x 與輸入向量y 的差異,第二項是平滑項,度量每一個變量xi 與其所在局部窗口中的鄰近像素xj,jNi 的差異,相對於Zij 。一般情況下這個局部窗口我們取當前像素點的四鄰域或者八鄰域。uiwij 都是一些權重信息,與所研究的問題相關,都是非負的。當uiwij 是常數時候,這個問題就是空間同性拉普拉斯,否則就是空間異性拉普拉斯問題了。

參考資料

FARBMAN, Z., FATTAL, R., LISCHINSKI, D., AND SZELISKI, R. 2008. Edge-preserving decompositions for multi-scale tone and detail manipulation. ACM Transactions on Graphics (Proc. SIGGRAPH) 27, 3 (August).
Krishnan D, Fattal R, Szeliski R. 2013. Efficient preconditioning of laplacian matrices for computer graphics[J]. ACM Transactions on Graphics (Proc. SIGGRAPH), 32,4

轉載請保留以下信息

作者 日期 聯繫方式
風吹夏天 2015年9月21日 [email protected]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章