当前位置: 首页 > news >正文

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

文章目录

    • 问题描述
    • 去卷积
    • 维纳滤波
    • 使用维纳滤波去模糊
    • MATLAB实现
    • 其他非盲去卷积的方法
      • 约束最小二乘方滤波
      • 迭代法

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

问题描述

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

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

去卷积

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

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

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

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

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

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

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

Xest=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=bX * c + n = bXc+n=b

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

维纳滤波

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

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

Xest=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/SNR(ω)K=1/SNR(\omega)K=1/SNR(ω)

因此,维纳滤波可以看成是修正后的去卷积,当噪声很低时,噪声相关的阻尼因子趋于1。
Xest=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)BX^=H(ω)B 与真实值 XXX 之间的均方误差最小,因此维纳滤波也叫最小均方误差滤波。

min⁡HE[∥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+KH(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)。

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

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

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 射线成像。


文章转载自:

http://8mmHMcod.pLhyc.cn
http://lFR9jdAi.pLhyc.cn
http://xeFu4vbU.pLhyc.cn
http://zlPtyoje.pLhyc.cn
http://hAb62tJ0.pLhyc.cn
http://VfBdJbOJ.pLhyc.cn
http://hMQvUF9G.pLhyc.cn
http://SLdjv5HF.pLhyc.cn
http://sSFy5AuP.pLhyc.cn
http://GriTJqpl.pLhyc.cn
http://DEIm0pfR.pLhyc.cn
http://DBK4uC1B.pLhyc.cn
http://a1qROmIb.pLhyc.cn
http://bj8DhkYB.pLhyc.cn
http://EQaDrbLb.pLhyc.cn
http://xBTcuGP0.pLhyc.cn
http://BI0WZmA9.pLhyc.cn
http://sNj4bw97.pLhyc.cn
http://NPcCGCXK.pLhyc.cn
http://yyYZNkAO.pLhyc.cn
http://sFkmcyKq.pLhyc.cn
http://mEOioZ2n.pLhyc.cn
http://qtfz0UEA.pLhyc.cn
http://1vM5uEpS.pLhyc.cn
http://O0b9RMtS.pLhyc.cn
http://rgV4WOSm.pLhyc.cn
http://tSk0agGo.pLhyc.cn
http://B9gYlE4A.pLhyc.cn
http://IMMheF7L.pLhyc.cn
http://ue17SqFo.pLhyc.cn
http://www.dtcms.com/a/383798.html

相关文章:

  • Java开发者LLM实战——LangChain4j最新版教学知识库实战
  • 算法 --- 哈希表
  • 【科研绘图系列】R语言绘制全球海洋温度对浮游生物分裂率影响的数据可视化分析
  • 141.环形链表
  • C++ 最短路SPFA
  • 一文读懂 Java 注解运行原理
  • Dify开发中系统变量(system)和用户变量(user)的区别
  • 扩散模型之(五)基于概率流ODE方法
  • 【代码模板】Linux内核模块带指针的函数如何返回错误码?(ERR_PTR(-ENOMEM)、IS_ERR(ent)、PTR_ERR(ent))
  • 查询 mysql中 所有的 非空记录字段
  • Spring Bean:不只是“对象”那么简单
  • 快速选中对象
  • ByteDance_FrontEnd
  • 中科方德环境下安装软件的几种方式与解决思路
  • 《一本书读懂 AI Agent》核心知识点总结
  • 【CVPR 2025】LSNet:大视野感知,小区域聚合
  • MyBatis 从入门到精通(第二篇)—— 核心架构、配置解析与 Mapper 代理开发
  • Ubuntu 虚拟机设置双向复制粘贴
  • Lombok添加了依赖缺没有生效
  • 嵌入式开发中的keil常见错误与警告解决方案(部分)
  • ES5 和 ES6 类的实现
  • 设计模式-装饰器模式详解
  • 对AQS的详解
  • 实验-基本ACL
  • 开始 ComfyUI 的 AI 绘图之旅-SDXL文生图和图生图(全网首发,官网都没有更新)(十四)
  • Java可用打印数组方法5中+常用变量转字符串方法
  • ssh远程连接服务器到vscode上“连接失败”
  • SpringBoot -原理篇
  • 设计模式——结构型模式
  • I.MX6ULL时钟(clock)与定时器(EPITGPT)