Image Smoothing via L0 Gradient Minimization

来源:互联网 发布:java识别图片中文文字 编辑:程序博客网 时间:2024/06/08 16:15

研究背景与意义

图像分解:将图像分解为具有不同特征的两层或多层图像。

应用领域:图像去噪,图像增强,高动态图像压缩。

(1)非真实感图像(卡通,铅笔画)

(2)去除卡通图像中的振铃现象(去噪)

(3)对比度增强(图像增强)

(4)图像压缩(HDR图像压缩)

(5)边缘矫正,使边缘变换更平缓

L0 smothing算法原理

图像分解为基础层图像和细节层图像:

I=S+D

式中,I为输入图像,S为基础层图像,D为细节层图像。SD未知,这是一个病态问题。为了求解,通常需要构建代价函数。

minS(SI)2)

由于需要得到的滤波图像(基础层图像)能够保留较大的边缘,同时去除图像中的纹理、小边缘等梯度较小的细节信息。因此可以考虑以下惩罚函数:
这里写图片描述

从而可得到目标函数:

这里写图片描述

为了便于求解,在此引入辅助变量h,v,公式如下:

这里写图片描述
式中,C(h,v)=#p||hp|+|vp|0|为自适应变化参数,用于调节和其梯度的相似性。img

具体求解步骤:

计算S:

这里写图片描述

利用FFT,求解等式(7),可得滤波图像S:

这里写图片描述

计算img

这里写图片描述

为了更直观的表示,用img代替img,重写上式为:

这里写图片描述

求解等式(11)可得:

这里写图片描述

推到过程如下:

这里写图片描述

算法实现步骤:

这里写图片描述

MATLAB代码:

function S = L0Smoothing(Im, lambda, kappa)if ~exist('kappa','var')    kappa = 2.0;endif ~exist('lambda','var')    lambda = 2e-2;endS = 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]);endbeta = 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('.');endfprintf('\n');end
阅读全文
0 0