研究背景与意义
图像分解:将图像分解为具有不同特征的两层或多层图像。
应用领域:图像去噪,图像增强,高动态图像压缩。
(1)非真实感图像(卡通,铅笔画)
(2)去除卡通图像中的振铃现象(去噪)
(3)对比度增强(图像增强)
(4)图像压缩(HDR图像压缩)
(5)边缘矫正,使边缘变换更平缓
L0 smothing算法原理
图像分解为基础层图像和细节层图像:
I=S+D
式中,
I
为输入图像,
由于需要得到的滤波图像(基础层图像)能够保留较大的边缘,同时去除图像中的纹理、小边缘等梯度较小的细节信息。因此可以考虑以下惩罚函数:
从而可得到目标函数:
为了便于求解,在此引入辅助变量h,v,公式如下:
式中,
C(h,v)=#p||hp|+|vp|≠0|
为自适应变化参数,用于调节和其梯度的相似性。
具体求解步骤:
计算S:
利用FFT,求解等式(7),可得滤波图像S:
计算:
为了更直观的表示,用代替,重写上式为:
求解等式(11)可得:
推到过程如下:
算法实现步骤:
MATLAB代码:
function S = L0Smoothing(Im, lambda, kappa)
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