实例:Tikhonov 正则化模型用于图片去噪
对于真实图片
和带噪声的图片
(其中
是高斯白噪声)。 Tikhonov 正则化模型为:
其中
,
分别表示
在水平和竖直方向上的向前差分,
为正则化系数。 上述优化问题的目标函数中,第二项要求恢复的
有较好的光滑性,以达到去噪的目的。 注意到上述目标函数是可微的,我们利用结合BB步长和非精确搜索的 的梯度下降对其进行求解。
目录
图片和参数准备
设定随机种子。
clear;
seed = 97006855;
ss = RandStream('mt19937ar','Seed',seed);
RandStream.setGlobalStream(ss);
载入未加噪的原图作为参考,记录为
u0
。
u = load ('tower.mat');
u = u.B1;
u = double(u);
[m,n] = size(u);
u0 = u;
生成加噪的图片,噪声
的每个元素服从独立的高斯分布
,并对每个像素进行归一化处理(将像素值转化到[0,1]区间内)。注意到 MATLAB 的
imshow
函数(当第二个参数设定为空矩阵时),能够自动将矩阵中最小的元素对应到黑色,将最大的元素对应为白色。
u = u + 20*randn(m,n);
maxu = max(u(:)); minu = min(u(:));
u = (u - minu)/(maxu - minu);
参数设定,以一个结构体提供各参数,分别表示
,梯度和函数值的停机标准,输出的详细程度,和最大迭代次数。
opts = struct();
opts.xtol = 1e-8;
opts.gtol = 1e-6;
opts.ftol = 1e-16;
opts.record = 0;
opts.maxit = 200;
求解正则化优化问题
分别取正则化系数为
和
,利用带BB 步长的梯度下降求解对应的优化问题,见<fminGBB.html 带BB步长线搜索的梯度法> 。
lambda = 0.5;
fun = @(x) TV(x,u,lambda);
[x1,~,out1] = fminGBB(u,fun,opts);
lambda = 2;
fun = @(x) TV(x,u,lambda);
[x2,~,out2] = fminGBB(u,fun,opts);
结果可视化,将不同正则化系数的去噪结果以图片形式展示。
subplot(2,2,1);
imshow(u0,[]);
title('原图')
subplot(2,2,2);
imshow(u,[]);
title('高斯噪声')
subplot(2,2,3);
imshow(x1,[]);
title('\lambda = 0.5')
subplot(2,2,4);
imshow(x2,[]);
title('\lambda = 2')
print(gcf,'-depsc','tv.eps')
Tikhonov 正则化模型的目标函数值和梯度计算
该无约束优化问题的目标函数为:
function [f,g] = TV(x,y,lambda)
分别表示带噪声图片和正则化参数,
f
,
g
表示在
x
点处的目标函数值和梯度。
第一项
用于控制去噪后的图片
和带噪声的图片
之间的距离。
f = .5*norm(x - y, 'fro')^2;
计算两个方向上的离散差分,
,
。
[m,n] = size(y);
dx = zeros(m,n); dy = zeros(m,n); d2x = zeros(m,n);
for i = 1:m
for j = 1:n
ip1 = min(i+1,m); jp1 = min(j+1,n);
im1 = max(i-1,1); jm1 = max(j-1,1);
dx(i,j) = x(ip1,j) - x(i,j);
dy(i,j) = x(i,jp1) - x(i,j);
离散的拉普拉斯算子
d2x
:
。
d2x(i,j) = x(ip1,j) + x(im1,j) + x(i,jp1) + x(i,jm1) - 4*x(i,j);