图像去模糊(约束最小二乘方滤波)

引言

这是图像去模糊的第三篇,接着上节说道逆滤波对噪声特别敏感。约束最小二乘方滤波(Constrained Least Squares Filtering,aka Tikhonov filtration,Tikhonov regularization)核心是H对噪声的敏感性问题。减少噪声敏感新问题的一种方法是以平滑度量的最佳复原为基础的,因此我们可以建立下列约束条件:

C=0M10N1[2f(x,y)]2(1)

其约束条件为
||GHF^||22=||N||22(2)

这里, F^ 是为退化图像的估计, N 为加性噪声,拉普拉斯算子 2 在这里表示平滑程度。

推导

如何求解这个式子呢,将上式表示成矩阵形式,同时将约束项转换成拉格朗日乘子项,可得到

||PF^||22λ(||GHF^||22||N||22)(3)

最小化上代价函数,对 F^ 求导,令等零。
PPF^=λH(GHF^)(4)

最后可得到,下列式子
F^=λHGλHH+PP=[H||H||22+γ||P||22]G(5)

这里, P 是函数
p=010141010(6)

的傅里叶变换。其实这就是那个拉普拉斯模板嘛。
嗯,和书上的公式一模一样,这就证明我们求解对了。
好了,我又可以重新造轮子了。

代码

close all;
clear all;
clc;
% Display the original image.
I = im2double(imread('lena.jpg'));
[hei,wid,~] = size(I);
subplot(2,3,1),imshow(I);
title('Original Image (courtesy of MIT)');


% Simulate a motion blur.
LEN = 21;
THETA = 11;
PSF = fspecial('motion', LEN, THETA);
blurred = imfilter(I, PSF, 'conv', 'circular');
subplot(2,3,2), imshow(blurred); title('Blurred Image');

% Inverse filter
If = fft2(blurred);
Pf = psf2otf(PSF,[hei,wid]);
deblurred = ifft2(If./Pf);
subplot(2,3,3), imshow(deblurred); title('Restore Image')

% Simulate additive noise.
noise_mean = 0;
noise_var = 0.00001;
blurred_noisy = imnoise(blurred, 'gaussian', ...
                        noise_mean, noise_var);
subplot(2,3,4), imshow(blurred_noisy)
title('Simulate Blur and Noise')

% Try restoration using  Home Made Constrained Least Squares Filtering.
p = [0 -1 0;-1 4 -1;0 -1 0];
P = psf2otf(p,[hei,wid]);

gama = 0.001;
If = fft2(blurred_noisy);

numerator = conj(Pf);
denominator = Pf.^2 + gama*(P.^2);

deblurred2 = ifft2( numerator.*If./ denominator );
subplot(2,3,5), imshow(deblurred2)
title('Restoration of Blurred Using Constrained Least Squares Filtering');

subplot(2,3,6); imshow(deconvreg(blurred_noisy, PSF,0)); title('Regul in Matlab');

依次是原图,运动模糊图像,逆滤波结果,运动模糊+高斯噪声,Home Made 约束最小二乘方滤波( γ=0.001 ),Matlab自带的去模糊deconvreg函数。

效果

这里写图片描述

嗯,可以看出我们做出来的约束最小二乘方滤波效果非常不错的(多亏我调的一手好参)。这里的 γ 是我自己手工设置的,也是多次尝试,以产生最好的视觉效果。我个人建议 γ 设置成0.001左右会有比较好的效果。一般的说法是,约束最小二乘方滤波对高噪声和中等噪声产生结果要好于维纳滤波,对于低噪声两种滤波产生结果基本相等。手工选取参数时效果会更好一些。
其实 γ 可以迭代最优化,Matlab自带的函数deconvreg即是如此,这样可以实现最佳复原算法,听起来不错。

迭代计算 γ

定义一个“残差”向量 R

R=GHF^(8)

F^=[H||H||22+γ||P||22]G ,我们需要最小化下列代价函数
ϕ(γ)=RTR=||R||22=trace(RTR)(9)

这里我们需要明白的是 R 是向量形式。将(5)式带入(9)中,最后得到
ϕ(γ)=γ2||G||22||P||42||H||42+2γ||H||22||R||22+γ2||P||42(10)

对于这个单变量函数,求其极小值可以借助于matlab的fminbnd函数。
好了,这个系列已经接近尾声了,可能就不在写了。如果还有疑惑可以看一下matlab中deconvreg.m源文件。
还有关于实际运用需要估计核PSF,关于PSF的估计可以参看 RESTORATION OF DEFOCUSED AND BLURRED IMAGES。上述介绍的都是比较传统的方法,关于盲区卷积,可以在网上用谷歌搜索Deblur最近几年发表的文章。

效果

这里写图片描述 这里写图片描述 这里写图片描述 这里写图片描述
这里写图片描述 这里写图片描述

更多阅读

RESTORATION OF DEFOCUSED AND BLURRED IMAGES http://yuzhikov.com/articles/BlurredImagesRestoration1.htm
图像去模糊 (维纳滤波)http://blog.csdn.net/bluecol/article/details/46242355
图像去模糊(逆滤波)http://blog.csdn.net/bluecol/article/details/47357717
数字图像处理(第三版) 冈萨雷斯著 chapter 5,图像复原与重建
MathLab source code, deconvreg.m

Licenses

作者日期联系方式
风吹夏天2015年8月8日wincoder@qq.com
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值