去卷积:用魔法打败魔法,让图像清晰

发布于:2025-09-15 ⋅ 阅读:(20) ⋅ 点赞:(0)

图像的模糊有很多种可能性,包括了:镜头的缺陷、相机的抖动、场景的运动、后期的处理等等。针对图像模糊,我们可以通过去卷积的方式实现图像复原。其中,去卷积分为非盲去卷积和盲去卷积,本文主要介绍非盲去卷积。

问题描述

假设有一个理想镜头,用它所成的像为x, 而实际镜头的点扩散函数(PSF)为c, 实际镜头的成像是b,那么这三者之间的关系是一种典型的卷积关系:

那么一个很自然的想法就是,如果我们有实际镜头的成像,另外还知道了镜头的PSF,即我们知道了上式的b和c,是否可以得到更加理想的成像x呢?

去卷积

这似乎是很显然能够成立的。由于空域的卷积等效于频域的乘法,因此我们只需要在频域上做除法,就能很好的恢复出 X X X了,我们把这个过程称为去卷积:

X ∗ c = b X * c = b Xc=b

注意:空域的卷积相当于频域的乘法

F ( X ) ⋅ F ( c ) = F ( b ) F(X) \cdot F(c) = F(b) F(X)F(c)=F(b)

去卷积相当于在频域上做除法

F ( X est ) = F ( b ) ∖ F ( c ) F(X_{\text{est}}) = F(b) \setminus F(c) F(Xest)=F(b)F(c)

只需要对除法的结果做反傅里叶变换就可以得到去卷积的结果了

X est = F − 1 ( F ( b ) ∖ F ( c ) ) X_{\text{est}} = F^{-1} (F(b) \setminus F(c)) Xest=F1(F(b)F(c))

实际成像系统有噪声,所以实际的成像公式是(其中n是指噪声)
X ∗ c + n = b X * c + n = b Xc+n=b

也就是说b里面含有噪声,所以如果简单的用F(b)/F©, 就会放大系统中高频部分的的噪声,最后只会得到一幅全是噪声的图像。

维纳滤波

那么,有没有更好的方法呢?事实上,已知模糊的图像以及成像系统的PSF,恢复原始图像的过程称为非盲去卷积(Non-blind deconvolution)。这个领域有大量的研究成果。

其中最最经典的方法之一,莫过于1942年发表的维纳滤波(Wiener Filter),它把图像和噪声都看做是随机过程,并把去卷积的问题看作是一个最大似然问题去求解。最后的结果中,包含了一个关键的噪声相关的阻尼因子。

X est = F − 1 ( ∣ F ( c ) ∣ 2 ∣ F ( c ) ∣ 2 + K ⋅ F ( b ) F ( c ) ) X_{\text{est}} = F^{-1} \left( \frac{|F(c)|^2}{|F(c)|^2 + K} \cdot \frac{F(b)}{F(c)} \right) Xest=F1(F(c)2+KF(c)2F(c)F(b))

其中分母有一项是K,它是一个规定常数:
K = 1 / S N R ( ω ) K=1/SNR(\omega) K=1/SNR(ω)

因此,维纳滤波可以看成是修正后的去卷积,当噪声很低时,噪声相关的阻尼因子趋于1。
X est = F − 1 ( 噪声相关的阻尼因子 ⋅ F ( b ) F ( c ) ) X_{\text{est}} = F^{-1} \left(\text{噪声相关的阻尼因子}\cdot\frac{F(b)}{F(c)}\right) Xest=F1(噪声相关的阻尼因子F(c)F(b))

维纳滤波的核心思想是寻找一个频域滤波器 H ( ω ) H(\omega) H(ω),使得估计值 X ^ = H ( ω ) B \hat{X} = H(\omega)B X^=H(ω)B 与真实值 X X X 之间的均方误差最小,因此维纳滤波也叫最小均方误差滤波。

min ⁡ H E [ ∥ X − H ( ω ) B ∥ 2 ] \min_H E\left[\|X - H(\omega)B\|^2\right] HminE[XH(ω)B2]

使用维纳滤波去模糊

维纳滤波器在频域的表达式为:
H ( u , v ) = P ∗ ( u , v ) ∣ P ( u , v ) ∣ 2 + K H(u,v) = \frac{P^*(u,v)}{|P(u,v)|^2 + K} H(u,v)=P(u,v)2+KP(u,v)
其中:

  • P ( u , v ) P(u,v) P(u,v) 是点扩散函数(PSF)的傅里叶变换(光学传递函数,OTF)。

在频域内进行维纳滤波时,根据以上维纳滤波器公式,由点扩散函数计算得到维纳滤波器,再将滤波器乘以图像以达到去模糊的目的,最后将结果反变换到空域即可。

💡 NOTE K = 0 K=0 K=0 时退化为逆滤波; K K K 增大时抑制噪声但会平滑细节。

MATLAB实现

clc;
clear;
close all;

%% 给图像加模糊
img = imread('cameraman.tif');
% img = rgb2gray(img); 
img = im2double(img);
% img = imnoise(img, 'gaussian', 0, 0.1);% 添加噪声

psf = fspecial("gaussian", 7, 1);
blurred = imfilter(img, psf, 'circular');

%% 只有模糊,直接逆滤波
fft_img = fft2(blurred); % 傅里叶变换
fft_psf = fft2(psf, size(img, 1), size(img, 2));
deblurred = ifft2(fft_img./fft_psf);

figure;
subplot(1, 3, 1), imshow(img), title("原图");
subplot(1, 3, 2), imshow(blurred), title("模糊,未叠加噪声");
subplot(1, 3, 3), imshow(deblurred), title("直接逆滤波,对未叠加噪声时效果较好");

%% 添加噪声,维纳滤波、约束最小二乘方滤波
mean = 0; 
var = 0.0001;
noised = imnoise(blurred, 'gaussian', mean, var);% 添加噪声
fft_img = fft2(noised); % 对含噪声图像进行傅里叶变换

% 直接逆滤波
deblurredn=ifft2(fft_img./fft_psf);

% 维纳滤波
K = 0.01; % 噪声与信号功率比的估计值,可根据实际情况调整
WienerFilter = conj(fft_psf)./(abs(fft_psf).^2 + K);
deblurred_wiener = ifft2(fft_img.* WienerFilter);

figure,
subplot(2, 2, 1), imshow(img), title("原图");
subplot(2, 2, 2), imshow(noised), title("模糊,叠加了高斯噪声");
subplot(2, 2, 3), imshow(deblurredn),title("直接逆滤波,对噪声非常敏感")
subplot(2, 2, 4), imshow(deblurred_wiener), title("维纳滤波");

其他非盲去卷积的方法

约束最小二乘方滤波

除了维纳滤波,还有维纳滤波的改进版本——约束最小二乘方滤波。该方法旨在降低维纳滤波器对噪声的敏感度,以平滑测度的最优复原为基础,因此添加拉普拉斯核进行约束。

约束最小二乘方滤波器在频域的表达式为:
H ( u , v ) = P ∗ ( u , v ) ∣ P ( u , v ) ∣ 2 + K ⋅ L ( u , v ) H(u,v) = \frac{P^*(u,v)}{|P(u,v)|^2 + K\cdot{L(u,v)}} H(u,v)=P(u,v)2+KL(u,v)P(u,v)
其中:

  • L ( u , v ) L(u,v) L(u,v) 是拉普拉斯核的傅里叶变换。

迭代法

Richardson-Lucy (RL) 反卷积算法是一种基于最大似然估计(Maximum Likelihood Estimation, MLE)的图像去卷积方法,常用于去模糊和图像增强。

该算法通过不断地更新图像估计值,来最小化模糊图像和恢复图像之间的误差,逐步消除模糊,最终接近真实的原始图像。每次迭代都会根据当前估计的图像来修正下次迭代的结果。

该算法最初由 Richardson 和 Lucy 在 1972 年提出,应用于天文学中的 X 射线成像。