圖像平滑是計算攝影學一門基礎重要的工具,其作用是拂去不重要的細節,保留較大的圖像邊緣,主要應用於邊緣檢測,JPEG壓縮圖像人工僞跡去除,非真實繪製等領域。
圖像平滑大體上可以分爲兩類:基於局部和基於全局方法,基於局部的方法像有名雙邊濾波,各向異性擴散,將圖像分成一些局部塊進行處理;全局方法比如全變分(Total Variation)和最小二乘濾波(Weighted Least Square),同時處理整幅圖像,可以達到全局最優的目的。
以往的方法,拂去圖像中去對圖像細節部分也會對圖像中大的邊緣進行懲罰,這樣也會導致圖像中大的邊緣減弱或丟失,因此徐立等人提出使用圖像L0範數平滑,該濾波器是一種基於稀疏策略的全局平滑濾波器。
本文是對香港中文大學徐立等人所做的《Image Smoothing via L0 Gradient Minimization》的讀後筆錄,也可以看成是論文的翻譯吧。使用圖像梯度L0範數平滑圖像,具有以下優點:
- 通過去除小的非零梯度,撫平不重要的細節信息
- 增強圖像顯著性邊緣
圖像梯度L0範數最小化
L0範數可以理解爲向量中非零元素的個數。
圖像梯度L0範數可以如下表示
這裏
這還不是我們的目標函數,只是一個約束條件。
圖像梯度最小化平滑
一維信號
先以一維信號爲例,輸入信號
左邊使得輸入信號與輸出信號儘可能接近,右邊非零約束梯度個數爲
實際上,
這裏
從下圖中可以看到梯度
二維圖像
二維圖像中,我們需要約束圖像水平和垂直方向的梯度數目,形式上如下
由於L0範數不可導,全局最優問題是一個NP難問題,所以這裏使用變量分裂法,鬆弛爲兩個二次規劃問題,每個問題都有其閉式解(closed-form)(因爲二次函數都可以求導,得到其最小值)。
迭代優化
- 給定
h,v ,計算f
E(f)=∑p(fp−gp)2+β⋅((∂xfp−hp)2+(∂yfp−vp)2)
對上式求解,結果取傅里葉變換,可得
f=F−1(F(g)+β(F(∂x)∗F(h)+F(∂y)∗F(v))F(1)+β(F(∂x)∗F(∂x)+F(∂y)∗F(∂y))
本應該ℱ是傅里葉變換專用符號,但這裏不支持,因此用了大寫F 。 - 給定
f ,計算h,v
E(h,v)=∑p((∂xfp−hp)2+(∂yfp−vp)2)+λβc(h,v)
c(h,v) 是|h|+|v| 中非零元素的個數
E(h,v)=∑p((∂xfp−hp)2+(∂yfp−vp)2)+λβH(|hp|+|vp|)
這裏H(|hp|+|vp|) 是一個二值函數,如果|hp|+|vp|≠0 返回1,否則0。對於每一個像素來說,有下式
Ep={(∂xfp−hp)2+(∂yfp−vp)2+λβH(|hp|+|vp|)}
上式取得最小值時,得到
hp,vp={(0,0)(∂xSp,∂ySp)(∂xSp)2+(∂ySp)2≤λ/βotherwise
這個證明比較簡單,詳細推到可以看論文。
代碼
% Distribution code Version 1.0 -- 09/23/2011 by Jiaya Jia Copyright 2011, The Chinese University of Hong Kong.
%
% The Code is created based on the method described in the following paper
% [1] "Image Smoothing via L0 Gradient Minimization", Li Xu, Cewu Lu, Yi Xu, Jiaya Jia, ACM Transactions on Graphics,
% (SIGGRAPH Asia 2011), 2011.
%
% The code and the algorithm are for non-comercial use only.
function S = L0Smoothing(Im, lambda, kappa)
%L0Smooth - Image Smoothing via L0 Gradient Minimization
% S = L0Smooth(Im, lambda, kappa) performs L0 graidient smoothing of input
% image Im, with smoothness weight lambda and rate kappa.
%
% Paras:
% @Im : Input UINT8 image, both grayscale and color images are acceptable.
% @lambda: Smoothing parameter controlling the degree of smooth. (See [1])
% Typically it is within the range [1e-3, 1e-1], 2e-2 by default.
% @kappa : Parameter that controls the rate. (See [1])
% Small kappa results in more iteratioins and with sharper edges.
% We select kappa in (1, 2].
% kappa = 2 is suggested for natural images.
%
% Example
% ==========
% Im = imread('pflower.jpg');
% S = L0Smooth(Im); % Default Parameters (lambda = 2e-2, kappa = 2)
% figure, imshow(Im), figure, imshow(S);
if ~exist('kappa','var')
kappa = 2.0;
end
if ~exist('lambda','var')
lambda = 2e-2;
end
S = im2double(Im);
betamax = 1e5;
fx = [1, -1];
fy = [1; -1];
[N,M,D] = size(Im);
sizeI2D = [N,M];
otfFx = psf2otf(fx,sizeI2D);
otfFy = psf2otf(fy,sizeI2D);
Normin1 = fft2(S);
Denormin2 = abs(otfFx).^2 + abs(otfFy ).^2;
if D>1
Denormin2 = repmat(Denormin2,[1,1,D]);
end
beta = 2*lambda;
while beta < betamax
Denormin = 1 + beta*Denormin2;
% h-v subproblem
h = [diff(S,1,2), S(:,1,:) - S(:,end,:)];
v = [diff(S,1,1); S(1,:,:) - S(end,:,:)];
if D==1
t = (h.^2+v.^2)<lambda/beta;
else
t = sum((h.^2+v.^2),3)<lambda/beta;
t = repmat(t,[1,1,D]);
end
h(t)=0; v(t)=0;
% S subproblem
Normin2 = [h(:,end,:) - h(:, 1,:), -diff(h,1,2)];
Normin2 = Normin2 + [v(end,:,:) - v(1, :,:); -diff(v,1,1)];
FS = (Normin1 + beta*fft2(Normin2))./Denormin;
S = real(ifft2(FS));
beta = beta*kappa;
fprintf('.');
end
fprintf('\n');
end
代碼也是非常清晰,容易理解的。關於其更多應用,可以查看原文。但是該方法基於迭代優化,迭代次數與kappa對數下降關係,
可執行程序
點此可下載exe程序,基於OpenCV編寫,僅供學習交流。
界面框架致謝:人在旅途
參考文獻
Image Smoothing via L0 Gradient Minimization
Image Smoothing via L0 Gradient Minimization PPT
Licenses
作者 | 日期 | 聯繫方式 |
---|---|---|
風吹夏天 | 2015年9月26日 | [email protected] |