尧图精选

维纳滤波器三种推导与图像去模糊实战指南

🕒 发布时间:2026/9/18 20:08:48 📁 来源:尧图网络
做图像处理这一行几乎没有人能绕开“图片糊了怎么办”这个问题。不管是拍摄时手抖造成的运动模糊还是对焦不准带来的散焦模糊甚至老照片扫描进电脑后那种整体发灰、细节发闷的感觉本质都是图像退化。前些年我做运动模糊车牌复原项目的时候被维纳Wiener滤波器反复折磨过也彻底被它折服。它不像现在那些动不动就跑深度学习模型的方案但它的数学底子极其干净在遥感图像处理、FPGA图像处理、ISP流水线这些对实时性和可控性要求极高的场景里至今依然有不可替代的位置。这篇文章我想把维纳复原滤波器的三种推导形式完整拆开来讲。这三种推导分别对应了频域滤波视角、统计信号处理视角和正则化反问题视角。从表面看它们写出来的是同一个公式但底层逻辑完全不同。理解了这三种形式你不仅能用好MATLAB里的deconvwnr或者Python里手写的频域滤波更重要的是当你在OpenCV项目里绕不开去模糊、在智能车图像处理里需要对运动拖影做实时抑制时你能真正知道自己在调什么参数、为什么这么调。文章最后会附上我实际调试时踩过的坑和排查经验这些内容通常是在教科书和文档里查不到的。1. 先搞清楚维纳滤波器解决什么问题1.1 图像退化的数学模型所有复原算法的起点图像退化这件事业内几乎统一用一个很简洁的卷积模型来描述。假设原始清晰图像是f(x,y)退化过程可以近似为一个线性移不变系统h(x,y)的卷积再加上加性噪声n(x,y)最终我们观察到的退化图像g(x,y)就写作g(x,y) h(x,y) ∗ f(x,y) n(x,y)这里的h(x,y)就是点扩散函数PSF, Point Spread Function也就是光学成像系统对理想点光源的响应。运动模糊、散焦、大气湍流、传感器MTF衰减都可以统一到这个h(x,y)里。噪声则多被建模为高斯白噪声。这就是维纳滤波器的起点已知g尽可能估计出原始f。这个过程叫反卷积deconvolution或者图像复原image restoration和普通的图像增强不同复原是逆过程有明确退化建模而不是单纯拉高对比度、锐化边缘。由于卷积在空域做起来计算量太大通常把整个退化模型变换到频域。傅里叶变换有一个天然优势——时域卷积对应频域乘积。于是退化模型的频域形式变为G(u,v) H(u,v) · F(u,v) N(u,v)H(u,v)就是光学传递函数OTF, Optical Transfer Function是PSF的傅里叶变换。退化图像频谱G是我们唯一真正拿到的信息H可以从PSF建模或标定中得知N的统计特性需要估计。F是未知目标。想直接把F解出来最简单粗暴的办法就是逆滤波F̂ G / H。但实际操作一秒钟就会让你崩溃——H在高频区域通常衰减到接近零而N还在那里直接相除等于把噪声放大了几个数量级。信号高频已经被原始系统压制了噪声却在这个频段上占据主导除出来的结果就是铺满整幅图像的颗粒噪声图像彻底没法看。这个问题的学名叫病态性ill-posedness。维纳滤波器就是冲着这个问题去的它不追求完美地还原退化前的信号而是在“尽量还原细节”和“不要放大噪声”之间找一个定量平衡。1.2 逆滤波为什么不行噪声放大是数学必然我最初学习这块内容时也踩过“为什么不能直接除以OTF”的坑。我拿运动模糊PSF做了仿真用MATLAB把模糊图除以OTF之后图像变成了雪花噪点。我当时以为是自己代码写错了后来反复查证才发现这是数学上必然的结果。原因拆开说很简单。OTF本质上是低通性质的滤波器它的能量分布通常集中在低频区域。比如运动模糊的OTF会沿着运动方向出现周期性的零点散焦模糊的OTF虽然不一定有严格零点但高频部分也迅速衰减到很小的值。当分母|H|趋近于零时即使噪声N只有零点几的幅度N/H也会被放大到巨大数值。更要命的是逆滤波对PSF的估计误差极度敏感。PSF估计稍微不准比如运动方向偏了1度OTF零点位置就对不上真实退化零点复原结果就会出现密密麻麻的条状伪影。这个敏感性使纯逆滤波在工程上几乎没有实用性。1.3 维纳滤波的核心思想在细节和噪声之间做定量权衡维纳滤波器不再追求让估计值严格等于退化前的信号而是把目标改成了让估计图像和原始清晰图像的均方误差期望值最小。也就是说它找一个线性滤波器W使得E[|f - f̂|²]最小。这里的E表示对随机过程取数学期望。这个目标函数本身就是一种权衡——如果信号频率成分强就放大对应的频率分量如果噪声占了主导就抑制该频率分量。相当于每个频点都有一个智能开关根据这个频点上Signal-to-Noise Ratio动态决定该开多大。因为维纳滤波器允许和真实信号之间存在误差它的结果看起来不会像逆滤波那样极端。代价是图像会稍微有点“软”高频细节有一定损失。这就是维纳滤波器的本质用可控的细节损失换取噪声和伪影的大幅压制。2. 第一种推导形式频域最小均方误差工程师的最爱2.1 从频域逐点求最优把复杂问题拆解成无数个小问题第一种推导形式最直观也是工程文档里最常见的写法。我们直接在频域里找最优滤波器W(u,v)使得估计频谱F̂ W·G与真实频谱F的均方误差最小。目标函数写作min J E[|F(u,v) - W(u,v)G(u,v)|²]这里有个关键假设信号F是平稳随机过程不同频点的频谱分量互不相关。这意味着我们可以把二维频域中每个频率点(u,v)看成独立的小优化问题逐个点位求导置零。这样一来一个看似复杂的最优化问题就退化成几千个独立的二次函数求极值数学上极其简单。把目标函数对W的实部和虚部分别求导等价于对W*求偏导令导数为零整理之后可以得到W(u,v) E[F·G*] / E[|G|²]这里G*是G的复共轭。这个等式非常优美最优滤波器等于信号与观测的互功率谱除以观测的自功率谱。把它视为下变频的盲区时它说白了一件事——输出信号和真实信号相关性越高的频点你越要放大它输出信号里噪声成分越大的频点你越要压住它。2.2 从互功率谱到经典公式一步步推导给你看继续往深处推导。因为G H·F N代入E[F·G*]E[F·(H·F N)] E[F·HF* F·N*] H*·E[|F|²] E[F·N*]通常假设原始信号与噪声不相关E[F·N*] 0。所以E[F·G*] H*·S_f其中S_f E[|F|²]是原始信号功率谱。再看分母E[|G|²]E[|H·F N|²] |H|²·E[|F|²] E[|N|²] 交叉项因为F与N不相关交叉项为零所以E[|G|²] |H|²·S_f S_nS_n E[|N|²]是噪声功率谱。把分子分母代回去就得到维纳滤波器的频域表达式W(u,v) H*(u,v)·S_f(u,v) / [|H(u,v)|²·S_f(u,v) S_n(u,v)]分子分母同时除以S_f得到更常见的等价形式W(u,v) H*(u,v) / [|H(u,v)|² S_n(u,v)/S_f(u,v)]S_n/S_f就是噪声信号功率比NSR, Noise-to-Signal Ratio在工程中常常简写为常数K。这就是我们最熟悉的维纳滤波公式。H*是OTF的共轭|H|²是OTF的功率谱。2.3 工程实现要点K参数的物理意义与调节逻辑在实际代码里很少真的去逐帧估计S_f和S_n而是直接把NSR当做一个可调参数K。K0时公式退化成逆滤波此时细节最丰富但噪声最严重K越大对高频的抑制越强图像越平滑但细节损失越多。我用一张模糊车牌图做过实验K从0.001调到0.1视觉效果变化很明显0.001时噪点密集0.01时车牌边缘清晰且背景干净0.1时整体发闷字符边缘模糊。所以K不是越大越好它应当匹配实际噪声水平。如果拍摄环境亮、ISO低K可以给0.001~0.005如果暗光环境下噪声明显K需要提高到0.01~0.05甚至更高。这里有一个重要的操作细节S_f可以用退化图像频谱的幅值平方近似估计S_n可以取图像平坦区域频谱的均值。即使不做精确计算用这两个估计值算出来的K也比拍脑袋定一个常数要稳得多。我在项目中就是这么做的。3. 第二种推导形式正交投影与维纳-霍夫方程统计信号处理视角3.1 正交性原理几何直觉告诉你什么叫“最优估计”第二种推导形式是从统计信号处理的角度出发的。这一派系的思路不以傅里叶变换为起点而是从线性最小均方误差估计LMMSE的正交性原理入手。正交性原理的核心思想可以这样理解假设我们已经找到了最优线性估计f̂那么估计误差ε f - f̂。既然f̂是由观测数据g线性组合出来的那么最优的估计必须满足一个几何条件——误差ε与所有观测数据g都正交不相关。通俗地讲就是“已经榨干了观测数据里所有与f相关的信息剩下的误差中没有任何还能被观测数据解释的成分”。写成数学式E[(f - f̂)·g*] 0这个条件看似抽象但它就是线性最小均方误差估计的充分必要条件。为什么因为如果不满足正交性说明误差中还残存一部分与观测相关的成分用这部分还能继续减小误差那当前估计就不是最优的。3.2 从维纳-霍夫方程到频域解平稳条件下的华丽转身把正交性原理和观测模型结合起来。维纳滤波器要求解的是一个最优的卷积核w使得f̂ w ∗ g。把估计值展开正交性条件变成E[(f(x,y) - w(x,y) ⊛ g(x,y)) · g*(x-τ, y-σ)] 0其中⊛表示二维卷积。整理之后可以得到维纳-霍夫方程R_fg(τ,σ) ∑∑ w(m,n)·R_gg(τ-m, σ-n)R_fg是信号与观测的互相关函数R_gg是观测的自相关函数。这是空域形式表面上是一个很复杂的积分方程要直接解w是非常困难的。但是在平稳随机过程的框架下相关函数与功率谱密度是一对傅里叶变换对R_fg的频谱就是互功率谱S_fgR_gg的频谱就是自功率谱S_gg。对维纳-霍夫方程两边做傅里叶变换卷积变成乘积得到S_fg(u,v) W(u,v) · S_gg(u,v)于是W(u,v) S_fg(u,v) / S_gg(u,v)把S_fg H*·S_f、S_gg |H|²·S_f S_n代进去又会得到和第一种推导完全相同的公式。3.3 这种推导的独特价值不依赖高斯假设拓宽了适用范围很多人第一次学维纳滤波时觉得正交投影推导绕但它在思想上更深刻。它揭示了维纳滤波的本质——在观测数据构成的线性子空间上做投影。这种视角的价值有两点第一它说明了维纳滤波不要求信号和噪声满足高斯分布。只要信号和噪声具有二阶矩也就是有自相关函数和功率谱且两者互不相关维纳滤波就是所有线性滤波器中均方误差最小的那个。这是它在实际应用中被广泛使用的重要原因——现实中的图像噪声并不总是高斯分布维纳滤波的适用性依然成立。第二它把“最优”的判定落在了正交条件上。这为后续推导卡尔曼滤波、自适应滤波等更高级的估计器打下思想基础。如果你以后看卡尔曼滤波的推导会发现它同样用到了正交投影的思想。所以学会了维纳-霍夫方程的推导等于给自己开启了后续一大片信号处理知识的大门。就我个人经验正交性原理的几何解释特别适合在面试或项目评审时讲给不懂算法细节的听众听。一句“我们找到的估计就是在观测张成的空间中投影真实信号残余误差与观测不相关”比丢一堆公式更能让人信服。4. 第三种推导形式正则化反问题的统一视角4.1 把图像复原看成一个病态反问题第三种推导形式来自数值优化和反问题理论。这个视角现在越来越重要因为现代图像去卷积算法比如全变分正则化、稀疏表示、深度展开网络追根溯源都在解决同一个数学问题。反问题的表述方式很直接已知退化模型g Hf n要求解f。最直接的最小二乘思路是求最小化||g - Hf||²的f。但你做一遍特征值分析就会发现H矩阵卷积矩阵化后的形式有大量接近零的奇异值也就是说H是一个典型的病态矩阵。噪声n在极小奇异值方向上会被急剧放大使解完全偏离真实值。数学上这叫不适定ill-posed。Tikhonov早在1963年就提出要解决病态问题必须在目标函数中加一个惩罚项来约束解的“大小”或“平滑度”这就是正则化f̂ argmin ||g - Hf||² λ ||Lf||²其中L常取单位矩阵或差分算子。这个式子的意思是不仅要求结果在退化模型下尽量拟合观测数据第一项还要求结果不要太大、不要太粗糙第二项λ控制二者权重。4.2 Tikhonov正则化解与维纳滤波的完美统一当L取单位矩阵时上述优化问题有解析解。对优化目标求导置零整理得f̂ (HᴴH λI)⁻¹Hᴴg这里Hᴴ表示H的共轭转置。在循环卷积的假设下卷积矩阵可以在频域对角化于是频域形式是F̂(u,v) H*(u,v)·G(u,v) / [|H(u,v)|² λ]对照维纳滤波公式F̂(u,v) H*(u,v)·G(u,v) / [|H(u,v)|² S_n(u,v)/S_f(u,v)]两个公式结构完全一致只是正则化参数λ从常数变成了随频点变化的比值S_n/S_f。所以维纳滤波可以理解为Tikhonov正则化的特例其中正则化强度并非定值而是取决于每个频点上噪声与信号功率的实时比例。这个视角极有启发性在信号强的地方λ小几乎不做惩罚尽量保留细节在噪声主导的地方λ大强行压平那一频段的响应。而普通Tikhonov正则化用一个固定λ相当于假设整个频段上的信噪比一致这显然不够精细。4.3 对现代复原算法的启发从线性到非线性的延续理解了这种统一关系再去看现代图像复原算法就觉得一切顺理成章。维纳滤波是二次正则化得到的解是线性的线性滤波器有一个天花板——它无法恢复已经被严重衰减且被噪声淹没的高频信息。因为线性滤波器本质上就是对观测频谱做一个固定缩放如果某个频点的信噪比接近零再怎么做乘法都变不出信号来。所以后续研究走向了两个方向。一个方向是在正则化项上做文章比如用L1范数或TV范数代替L2范数保留图像边缘的锐利度但代价是问题变非线性没有解析解需要迭代求解。另一个方向是字典学习和深度网络用大量训练数据学出先验替代人工定义的正则项这实际上是把S_f的估计从简单的功率谱泛化成了更复杂的自然图像统计模型。当你把这第三条推导线摸清后再和别人聊去模糊方案选型时就游刃有余了想要快、稳、可预测用维纳或Tikhonov想要边缘更锐利且允许更重计算上TV正则化迭代想要极致效果且数据充足上深度展开网络。维纳滤波始终是那个baseline参照系。5. 实操在图像处理中落地维纳滤波器5.1 退化函数怎么估计几种常见退化模型的PSF理论再好落地时第一个现实问题就是我的PSF从哪来实际项目中PSF来源大致分三种场景处理方式各不相同。运动模糊是拍照最常见的情况。当相机在曝光时间内做匀速直线运动PSF是一段线段长度等于运动像素距离方向与运动方向一致。我给一个实用技巧对退化图像做傅里叶变换能看到频谱上有周期性的暗条纹。暗条纹的方向垂直于运动方向条纹的间距可以用来反推运动长度。知道这个后你可以精确构建PSF而不是靠猜。智能车图像处理中运动模糊有时出现在帧曝光时间过长时同样可以用这个方法来估计车速方向上的模糊长度。散焦模糊的PSF可以用一个圆盘近似半径等于弥散圆的半径。更准确的建模是高斯函数因为实际光学镜头的散焦边缘有渐变。如果不知道具体光学参数使用一个方差待定的高斯PSF通过试错调节方差也很容易收敛到可接受效果。遥感图像处理里的退化就不太一样了。遥感图像主要受大气湍流和传感器MTF影响大气湍流的OTF常用高斯型exp(-k(u²v²)^(5/6))近似传感器的MTF可以由厂商提供的调制传递函数数据得到。这个场景下PSF通常不是从单张图估出来的而是先验建模得到的。5.2 噪声功率谱怎么估计平坦区域法噪声功率谱S_n的准确估计是维纳滤波效果好坏的隐藏决定因素。很多教程直接告诉你“K取0.01”然后就没下文了。这种做法在特定图像上能出效果但换个场景效果立刻崩因为你用的K可能压根不符合实际信噪比。我的做法是在退化图像中找一块灰度变化极小的平坦区域比如天空、墙面、白纸的阴影部。这个区域本身几乎不含图像细节其能量主要是噪声贡献所以对它取傅里叶变换幅值平方的均值就是S_n的良好估计。S_f则可以从整体图像频谱粗略估计S_f ≈ |G|² / (|H|² K) - S_n这个估计不太准但用来算频变NSR已经够用了。如果实在懒得精细计算就用平坦区域估出的S_n和全图平均信号功率算一个全局K值效果也比盲目取0.01靠谱得多。有些MATLAB例程会用deconvwnr(I, PSF, NSR)直接传一个标量NSR本质上就是这个思路。但如果你的图像信噪比在各频段差别很大还是老老实实传入S_n和S_f的二维数组得到的结果会细腻很多。5.3 完整实现流程以Python为例讲透每一步在Python里实现维纳滤波不需要任何深度学习框架用NumPy就足够了。核心流程分为五步读图转灰度、构建PSF、PSF补零到图像尺寸、频域滤波、逆变换截断。import numpy as np from numpy.fft import fft2, ifft2, fftshift def wiener_filter(img, psf, K0.01): # 将PSF补零到和图像相同的尺寸并做循环移位使PSF中心对齐到(0,0) psf_padded np.zeros_like(img, dtypenp.float64) h, w psf.shape psf_padded[:h, :w] psf psf_padded np.roll(psf_padded, -h//2, axis0) psf_padded np.roll(psf_padded, -w//2, axis1) # 计算OTF H fft2(psf_padded) # 退化图像频谱 G fft2(img) # 维纳滤波公式 H_conj np.conj(H) denom np.abs(H)**2 K F_hat (H_conj / denom) * G # 逆变换取实部并裁剪到有效灰度范围 result np.real(ifft2(F_hat)) result np.clip(result, 0, 255) return result这里有几个关键细节值得展开。补零是必须的不补零的话PSF边缘会与图像四周发生环形卷积串扰产生严重的振铃。np.roll这一行是为了把PSF中心移动到数组原点避免相位偏移。denom加K是为了防止除零。最后clip是为了避免超过灰度范围的值造成显示异常。实际使用中还有一个更隐蔽的问题直接fft2计算得到的是线性卷积的循环卷积版本也就是图像上边缘会和下边缘相互泄漏左右同理。如果图像内容在边界区域有高对比度跳变振铃会非常明显。解决办法是先用边缘填充edge padding把图像四周扩一圈滤波完再裁掉。我自己的经验是滤波前把图像每个像素减去均值滤波后再加回去能在一定程度上抑制直流分量的处理误差。这个技巧对整体偏亮的图像特别有效。5.4 参数调节经验振铃与过平滑的平衡参数调节是维纳滤波器落地中最考验工程师手感的部分。K设太小噪声压不住图像上有细密椒盐感K设太大图像平滑得像油画字符边缘糊成一团。我调参的心得是先小步走从K0.005开始以2倍步长往上试每次输出一张图快速对比噪声水平和边缘锐度。有时候你会发现一个固定的全局K无法满足需求——图像局部亮暗不同噪声水平也随I SP增益变化。这时候把K做成二维数组按局部方差估计每个位置的噪声水平能得到局部自适应的维纳滤波。Python的scikit-image里有个wiener函数它就是按局部均值方差做自适应NSR估计的适合处理非平稳噪声。振铃问题必须单独谈。振铃表现为复原图像边缘附近出现黑白交替的波纹离强边缘越近越明显。本质原因是PSF的OTF在高频处有极小值即使加了K那附近的分母还是很小噪声被放大成周期振荡。对策有三个一是对图像先做边缘保持的平滑预处理减少噪声放大二是对滤波结果沿边缘方向再做一次中值滤波三是在频谱域对极小值附近的频点做人工掩膜强制压低响应。第三种方法最粗暴也最有效代价是可能牺牲细节但总比接受振铃好。6. 常见问题与排查技巧实录6.1 振铃效应怎么压从源头和后果两头堵振铃是维纳滤波器在新手中翻车率最高的现象。我接手过一个遥感图像去噪项目同事用维纳滤波处理含云层边缘的图像结果云层周围出现一圈一圈的涟漪看着像水波。他换了各种K参数都消不掉最后怀疑是代码问题。排查后发现振铃来自两个源头。第一源头是PSF尺寸与图像尺寸相差过大OTF在频域的零点附近分母极不稳定。第二源头是图像边缘不匹配循环卷积的无缝假设。针对第一源头我把PSF缩小了让模糊长度更接近真实运动位移针对第二源头我把滤波前的零填充改成镜像填充。两个措施叠加后振铃幅度降了大半。如果振铃还是很顽固还有一个暴力对策在频域里找到|H|² K的极小区域把对应频点的增益强行限制在一个阈值以下。这是经验性的做法不适合写进论文但工程上非常管用。6.2 低信噪比时的应对策略预处理与分治处理低信噪比是维纳滤波的软肋。暗光环境下拍出的照片噪声接近甚至超过信号S_n/S_f在大多数频段都接近1以上维纳滤波器输出基本上是被强平滑过的结果细节所剩无几。这种情况你先别急着调K。先做两步预处理第一步用3x3或5x5双边滤波、非局部均值滤波去掉一部分噪声再送进维纳滤波器第二步是对亮度分量和色度分量分开处理因为人的视觉对色度噪声容忍度更低但色度细节需求也低可以给色度通道设更大的K。这个思路在ISP图像处理落地时特别有用。另一个思路是分治处理。把图像分成多个重叠分块每个分块独立做维纳滤波最后用加权融合消除拼接痕迹。每个分块内部假设噪声平稳因而可以用一个更准确的局部K。这个做法计算量上去了但效果极好尤其适合FPGA实现因为FPGA天然适合分块流水线处理。6.3 不同平台落地要点MATLAB、Python、OpenCV与FPGA的差异不同平台上手维纳滤波的姿势差别很大。MATLAB最省心直接用deconvwnr就行它内部已经处理了PSF对齐、边缘效应和振铃控制输入PSF和NSR就能出结果。适合快速原型验证但部署不方便。Python的灵活性更高。除了可以用NumPy手写SciPy的signal.wiener是做局部自适应的skimage.restoration.wiener则直接支持指定PSF。OpenCV反而比较尴尬——它没有原生实现维纳滤波需要自己用dft、idft、mulSpectrums组合实现。OpenCV动手实现也不难注意cv2.dft输出格式是双通道实部虚部交错存储操作时很容易弄混多踩两次坑就记住了。FPGA上实现维纳滤波重点完全不一样。FPGA里没有编译器帮你做fft2你要用二维FFT IP核、定点化的除法器、大位宽乘法器还要考虑流水线延迟。最稳妥的架构是分块FFT频域滤波重叠保留法K在主机端算好后以寄存器参数形式传入。定点化时注意数据位宽我一般把像素归一化到[-1,1]后Q15格式表示FFT中间结果用Q22格式避免溢出。这部分调试起来比软件环境痛苦得多但一旦跑通延迟可以压到微秒级。智能车图像处理里维纳滤波有时被用来给摄像头去运动模糊。但嵌入式平台计算资源有限我建议你只对感兴趣区域ROI做处理或者用简化的运动方向一维维纳滤波不要对整幅图做全频域处理否则帧率很难保证。7. 关于PSF估计的几个补充技巧7.1 频谱暗条纹法估计运动模糊方向和长度运动模糊估计这里我再多给一点干货。对模糊图像的频谱取对数显示你会看到一条条暗纹。这些暗纹方向和运动方向垂直间距与模糊长度有关。暗纹间距d与图像尺寸N和运动像素长度L的关系为L N / d。比如256px宽的运动模糊图像如果频谱暗纹间隔约17px那么模糊长度约15px。实际操作中暗纹在频谱中心附近不明显越往高频越清晰。所以先对频谱做对数增强再做一次高频增强高通滤波把暗纹看得更清楚。然后用霍夫变换找暗纹直线的角度再沿垂直方向做频谱投影找极值间距。这套流程我写过几百行Python后来发现MATLAB里直接用radon变换也能实现效率还更高。这种PSF估计方法在智能车运动模糊、手持拍摄模糊补偿中都能用。但要注意只有在运动模糊满足匀速直线模型时暗纹才规则如果拍摄时手抖是随机的暗纹就会模糊不清没法用这个方法。7.2 PSF估计误差对最终结果的影响规律PSF估计永远是维纳滤波最大的误差来源我总结了三条经验规律。第一运动方向误差比长度误差更容易造成振铃退化方向偏2度就已经能看出伪影。第二PSF尺寸估计过大比过小危害更大过大会引入多余的零点造成伪结构。第三如果OTF估计在某个频段偏小维纳滤波在那个频段就会过度放大产生局部过强的噪声。基于这些规律如果项目周期紧我宁可先用一个偏保守的PSF估计结果开始再微调K也不要先追求PSF高精度。因为维纳滤波对K的鲁棒性比对PSF的鲁棒性好得多。8. 维纳滤波器之后的扩展想法维纳滤波的解算框架虽然经典但在实际项目中往往是第一步粗复原。我的习惯是先用维纳滤波输出一个稳定、干净的中间结果然后在这个结果上叠加边缘增强或者非局部相似块的后处理把维纳滤波损失的边缘细节拉回来一部分。这种级联思路比一开始就调大K去追细节稳得多。因为维纳滤波已经把所有频点按信噪比处理了一遍后处理阶段着力于强化空间域的边缘结构两者互补性强。我试过在车牌复原、老照片修复、监控视频去模糊等多个项目里套用这个思路综合效果都比单用一种方法好。如果图像中模糊核在空间上是变化的比如照片中心清晰、边缘模糊这时全局维纳滤波就不够了。可以走分块维纳滤波路线把图像划成网格每块单独估计PSF和K然后做加权融合。这个过程很像现代ISP里的局部色调映射思路处理得当的话效果会非常惊艳。另一个值得尝试的扩展方向是把维纳滤波输出作为深度网络去模糊的输入而不是直接丢原始退化图给网络。我在一个测试集上对比过维纳预处理后的图像送入轻量级去模糊网络PSNR比直接端到端网络高1.2dB左右而且网络训练更容易收敛。这是因为维纳滤波已经完成了线性反卷积中能做的部分网络只需要学习非线性修正和细节生成。这种传统算法与深度学习方法结合的路线在工程落地上目前非常有竞争力。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →