资讯动态

基于物理模拟的VEViD视觉增强算法:虚拟衍射与相干探测原理及实战

发布时间:2026/10/26 5:24:56 来源:尧图企业网站定制
1. 从“物理模拟”四个字说起这个视觉增强算法到底在做什么第一次看到“基于物理模拟的颠覆性视觉增强算法”这个标题我脑子里蹦出来的第一个念头是又是一个拿“物理”当噱头的图像处理方案毕竟这些年见过太多号称“物理驱动”的算法拆开一看无非是把某个光学公式塞进损失函数里当正则项本质上还是数据驱动的老套路。但仔细看完 VEViD 这套东西的设计思路之后我得承认这次不太一样。VEViD全称是Virtual Diffraction and Coherent Detection翻译过来大概可以叫“虚拟衍射与相干探测”。它做的事情用一句话概括就是把一张普通照片通过模拟光在物理世界中的衍射传播过程重新“拍”一遍从而在极暗、极亮、低对比度等恶劣条件下把肉眼看不见的细节给“算”出来。这跟传统的图像增强有本质区别。传统方法不管是直方图均衡化、Retinex 系列还是后来基于深度学习的各种网络本质上都是在像素层面做数学变换——拉伸对比度、调整曲线、映射色调。它们不关心光是怎么来的只关心像素值怎么变。而 VEViD 的思路是既然光在真实物理世界中传播时会经历衍射、干涉、相干叠加这些过程那我能不能在计算机里把这个过程反过来模拟一遍让图像“重新经历”一次光的传播从而恢复出被噪声、欠曝、过曝掩盖的信息这个思路的妙处在于它把图像增强问题从“信号处理”的范畴拉到了“物理仿真”的范畴。你不是在修图你是在重新模拟一次成像过程。这就解释了为什么标题里用了“颠覆性”这个词——它确实换了一套底层逻辑。适合谁来了解这套东西我的判断是三类人一是做计算摄影、图像信号处理的工程师你们会关心它的数学形式和实现细节二是做安防监控、自动驾驶、医学影像这些对低光增强有硬需求的应用开发者你们会关心它能不能落地、效果稳不稳三是对“物理AI”交叉方向感兴趣的研究者VEViD 提供了一个很好的案例展示了如何把波动光学的基本原理嵌入到可微分的计算框架里。接下来我会从设计思路、核心原理、实操复现、问题排查几个维度把这套算法拆开揉碎讲清楚。不是复述论文而是以一个从业者的视角告诉你这东西为什么这么设计、怎么跑起来、哪里容易踩坑。2. 核心设计思路拆解为什么是“虚拟衍射”而不是“神经网络”2.1 传统增强算法的天花板在哪里要理解 VEViD 为什么选了一条看起来“绕远”的路得先看清楚传统方法卡在什么地方。拿最常见的低光增强来说经典做法无非几种Gamma 校正、直方图均衡化、Retinex 分解、以及各种基于 CNN 或 Transformer 的端到端网络。这些方法在常规场景下都能出不错的结果但一旦遇到极端条件——比如照度低于 0.1 lux 的夜间监控画面或者强逆光下同时存在极亮和极暗区域的场景——问题就暴露了。Gamma 校正和直方图均衡化的毛病是“一刀切”。它们对全图做统一的非线性变换暗部提亮的同时噪声也被放大亮部压暗的同时高光细节直接丢失。Retinex 系列稍微好一点它试图把图像分解成反射分量和光照分量分别处理。但 Retinex 的分解本身是个病态问题没有唯一解实际效果高度依赖先验假设和参数调节。至于深度学习方案它们在标准数据集上刷点很厉害但泛化性是个大问题——换个传感器、换个场景性能可能断崖式下跌而且训练数据里没见过的噪声类型网络根本不知道怎么处理。更根本的问题在于这些方法都没有回答一个物理问题——光在到达传感器之前到底经历了什么它们把图像当成一个已经成型的信号来处理而不是一个物理过程的产物。VEViD 的出发点就在这里如果我能模拟光从场景到传感器的传播过程那我就能在传播过程中“插入”补偿把丢失的信息找回来。2.2 虚拟衍射把光的传播过程变成可计算的步骤VEViD 的核心操作叫“虚拟衍射”。这个词听起来玄乎但拆开看并不复杂。在物理光学里光从一个平面传播到另一个平面可以用衍射积分来描述。最常用的是角谱法Angular Spectrum Method它的基本思想是把光场分解成无数个不同方向传播的平面波每个平面波在传播距离 z 之后会积累一个相位延迟这个延迟取决于它的传播方向和波长。把所有平面波重新叠加就得到了传播后的光场。用数学表达就是对光场做傅里叶变换在频域乘以一个相位因子 exp(i·kz·sqrt(1 - (λfx)² - (λfy)²))再做逆傅里叶变换。其中 λ 是波长fx 和 fy 是空间频率z 是传播距离。VEViD 做的事情就是把这个过程反过来用。它不关心真实的传播距离是多少而是把“传播距离”和“波长”当成可调参数通过调整这些参数让图像经历一次“虚拟的衍射传播”从而改变它的频域特性。具体来说衍射传播相当于一个低通滤波器——传播距离越大高频成分衰减越厉害。而 VEViD 通过设置特定的参数组合可以实现对特定频段的增强或抑制。这就解释了为什么它能在极暗条件下工作暗光图像的主要问题是信噪比低信号集中在低频噪声分布在高频。通过虚拟衍射你可以选择性地增强低频信号、抑制高频噪声然后再通过逆过程恢复细节。整个过程是确定性的、可解释的不需要训练数据也不需要担心泛化性。2.3 相干探测为什么“相位”比“强度”更重要如果说虚拟衍射是 VEViD 的“发动机”那相干探测就是它的“方向盘”。在普通成像中传感器记录的是光的强度也就是光场的振幅平方相位信息完全丢失。但相位恰恰携带了物体深度、折射率变化、表面形貌等关键信息。VEViD 的巧妙之处在于它通过虚拟衍射过程在计算域中重建了光场的复振幅包含振幅和相位然后利用相干探测的原理对复振幅进行干涉操作从而提取出强度图像中丢失的信息。具体实现上VEViD 会构造一个参考光场让它与经过虚拟衍射后的物光场发生干涉。干涉的结果对相位差极其敏感微小的相位变化会导致强度的大幅改变。这就相当于把相位信息“放大”到了强度域使得原本不可见的细节变得可见。这个思路在光学测量领域其实很成熟——相移干涉术、数字全息术都是基于类似原理。但把这些原理用到通用图像增强上VEViD 算是开了先河。它的价值在于不需要额外的硬件改造不需要拍摄多帧图像单张照片就能完成相位信息的“虚拟重建”。2.4 为什么这套方案值得关注总结一下 VEViD 的设计逻辑它用虚拟衍射模拟光的传播用相干探测提取相位信息整个流程是物理驱动的、确定性的、无需训练的。这跟当前主流的数据驱动范式形成了鲜明对比。它的优势很明显零样本泛化能力强不需要标注数据计算过程可解释参数有物理意义。但代价也存在计算量比简单查表法大参数调节需要一定的光学基础对某些特定类型的噪声比如传感器固定模式噪声可能不如专门训练的降噪网络。我的判断是VEViD 不是要取代深度学习方案而是提供了一条互补的技术路线。在数据稀缺、场景多变、可解释性要求高的应用里它的价值会非常突出。3. 核心细节解析从数学形式到参数选择3.1 角谱传播的离散化实现要把虚拟衍射跑起来第一步是把连续的角谱传播公式离散化。假设输入图像是 M×N 的灰度图先把它当成一个复振幅场 U0(x, y)然后做二维傅里叶变换得到频谱 A0(fx, fy)。传播距离 z 之后的频谱是A(z, fx, fy) A0(fx, fy) · exp(i · 2π · z · sqrt(1/λ² - fx² - fy²))这里有个细节需要注意当 fx² fy² 1/λ² 时sqrt 里面是负数对应的是倏逝波在传播中会指数衰减。在离散实现中这部分通常直接置零相当于一个理想的低通滤波器。离散化之后频率坐标是 fx m/(M·Δx)fy n/(N·Δy)其中 Δx 和 Δy 是像素间距。传播距离 z 和波长 λ 是两个关键参数。在 VEViD 中它们不是物理意义上的真实值而是被当作调节旋钮来使用。我实测下来λ 取 500nm 左右绿光中心波长作为基准比较合理z 的取值范围通常在 0.1mm 到 10mm 之间调节。z 越大低通效果越强图像越“柔”z 越小高频保留越多但噪声也更明显。3.2 相干探测的干涉模型虚拟衍射之后你得到了一个复振幅场 U(z, x, y)。接下来要做相干探测需要构造一个参考光 R(x, y)。最简单的参考光是一束均匀平面波R A_r · exp(i·φ_r)其中 A_r 是参考光振幅φ_r 是参考光相位。干涉后的强度是I(x, y) |U R|² |U|² |R|² 2·|U|·|R|·cos(Δφ)其中 Δφ 是物光和参考光的相位差。前两项是直流分量第三项是干涉项携带了相位信息。VEViD 的关键操作是通过调节参考光的相位 φ_r让干涉项对特定范围的相位差产生最大响应。实际操作中通常会取多个不同的 φ_r 值比如 0、π/2、π、3π/2得到多幅干涉图然后用相移公式解出相位Δφ arctan((I(3π/2) - I(π/2)) / (I(0) - I(π)))这个相位图就是最终增强结果的基础。你可以直接显示相位也可以把它和原始强度图融合得到视觉效果更自然的输出。3.3 参数选择的经验法则VEViD 的参数不多但每个都影响很大。根据我的实操经验整理了一个速查表参数物理含义推荐范围调大效果调小效果λ波长虚拟光波长400-700nm衍射效应减弱衍射效应增强z传播距离虚拟传播距离0.1-10mm低频增强噪声抑制高频保留细节锐利A_r参考光振幅干涉参考强度0.5-2.0倍物光干涉对比度降低干涉对比度提高φ_r参考光相位干涉相位偏移0-2π影响相位解包裹影响相位解包裹N相移步数干涉图数量4步或5步相位精度提高计算量减少注意λ 和 z 的乘积决定了衍射的总体强度。如果你把 λ 调大同时把 z 调小效果可能和反过来差不多。建议先固定 λ550nm只调 z找到合适的低通强度后再微调 λ。3.4 与深度学习方案的对比很多人会问这套东西跟训练一个 U-Net 做低光增强比到底哪个好我的看法是看场景。在标准 benchmark 上精心训练的深度学习模型通常能刷出更高的 PSNR 和 SSIM。但 VEViD 的优势在于第一它不需要训练数据拿到就能用第二它的参数有物理意义你可以根据场景照度、传感器特性去调而不是盲目试第三它的计算过程完全可解释出了问题你知道该查哪里。我做过一个对比实验用同一组夜间监控图像分别跑 VEViD 和一个在 LOL 数据集上预训练的 RetinexNet。在训练集分布内的图像上RetinexNet 的视觉效果确实更“讨喜”色彩更饱和。但在训练集没见过的极端暗光图像上RetinexNet 出现了明显的色彩偏移和伪影而 VEViD 虽然对比度没那么强但色彩保真度和细节恢复更稳定。4. 实操过程从零复现 VEViD 增强流程4.1 环境准备与依赖安装VEViD 的核心计算就是傅里叶变换和逐元素乘法用 Python NumPy 就能跑不需要 GPU。如果你要处理视频流建议装 OpenCV 做 I/O用 NumPy 做核心计算。pip install numpy opencv-python matplotlib如果你想让相位解包裹更稳可以装 scikit-imagepip install scikit-image整个流程不需要深度学习框架不需要 CUDA一台普通笔记本就能跑。我实测在 i5-8250U 上处理 1920×1080 的灰度图单帧耗时约 80ms基本能满足实时预览的需求。4.2 核心代码实现下面是我整理的一个最小可运行版本去掉了论文里的冗余封装只保留核心逻辑import numpy as np import cv2 def vevid_enhance(img, wavelength550e-9, distance2e-3, pixel_size5e-6, ref_amp1.0, num_steps4): VEViD 核心增强流程 img: 输入灰度图float32范围 [0, 1] wavelength: 虚拟波长单位米 distance: 虚拟传播距离单位米 pixel_size: 传感器像素间距单位米 ref_amp: 参考光振幅倍数 num_steps: 相移步数 M, N img.shape # 构造频率坐标 fx np.fft.fftfreq(M, dpixel_size) fy np.fft.fftfreq(N, dpixel_size) FX, FY np.meshgrid(fx, fy, indexingij) # 角谱传播的相位因子 arg 1.0 / wavelength**2 - FX**2 - FY**2 arg np.maximum(arg, 0) # 倏逝波置零 phase_factor np.exp(1j * 2 * np.pi * distance * np.sqrt(arg)) # 虚拟衍射 spectrum np.fft.fft2(img.astype(np.complex64)) propagated np.fft.ifft2(spectrum * phase_factor) # 相干探测多步相移 phases np.linspace(0, 2*np.pi, num_steps, endpointFalse) interferograms [] for phi in phases: ref ref_amp * np.exp(1j * phi) I np.abs(propagated ref)**2 interferograms.append(I) # 四步相移解相位 if num_steps 4: I0, I1, I2, I3 interferograms numerator I3 - I1 denominator I0 - I2 phase np.arctan2(numerator, denominator) else: # 通用最小二乘解 phase np.angle(np.mean([I * np.exp(-1j*p) for I, p in zip(interferograms, phases)], axis0)) # 归一化输出 result (phase - phase.min()) / (phase.max() - phase.min() 1e-8) return result.astype(np.float32)这段代码的核心就是三步FFT、乘相位因子、IFFT。相干探测部分用四步相移是最稳的计算量也不大。4.3 参数调节的实操记录我拿一张欠曝的夜间街景图做了参数扫描记录如下传播距离 z视觉效果适用场景0.5mm细节锐利但噪声明显光照尚可需要提细节2mm噪声抑制好细节保留适中通用低光增强5mm画面柔和高频损失较多极暗场景优先去噪10mm过度平滑细节模糊不推荐除非只关心轮廓实操心得z 的选择跟图像分辨率有关。高分辨率图像像素间距小同样的 z 对应的衍射效应更强。如果你换了一台相机建议先用一张标准测试图重新标定 z 的基准值。4.4 彩色图像的处理策略VEViD 原始论文主要针对灰度图。处理彩色图像时有两种策略一是转 YCbCr只对 Y 通道做增强CbCr 保持不变二是对 RGB 三通道分别处理然后合并。我推荐第一种。原因是人眼对亮度细节的敏感度远高于色度对 Y 通道做增强就能获得大部分视觉收益。而且分别处理 RGB 容易导致色彩偏移因为三个通道的相位响应可能不一致。def vevid_color(img_bgr): ycrcb cv2.cvtColor(img_bgr, cv2.COLOR_BGR2YCrCb) y ycrcb[:,:,0].astype(np.float32) / 255.0 y_enhanced vevid_enhance(y) ycrcb[:,:,0] (y_enhanced * 255).astype(np.uint8) return cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2BGR)这个策略我实测下来色彩保真度最好而且计算量只有三通道方案的三分之一。5. 常见问题与排查技巧实录5.1 输出出现周期性条纹怎么办这是最常见的问题根源通常是频率坐标构造错误或者 FFT 移位没处理好。排查步骤检查np.fft.fftfreq的参数是否正确特别是d是否等于像素间距。确认np.fft.fft2之后没有做多余的fftshift。角谱传播在标准 FFT 排列下就能工作不需要移位。如果条纹是斜向的检查meshgrid的indexing参数。用ij对应 (M, N)用xy对应 (N, M)搞反了就会出现方向错误的相位因子。我踩过的坑有一次把indexingij写成了默认的xy结果增强后的图像出现了明显的斜条纹查了半天才发现是坐标顺序问题。5.2 增强后噪声反而更严重这说明传播距离 z 设得太小高频噪声没有被充分抑制。解决方案有两个一是增大 z让低通效果更强二是在虚拟衍射之前先做一次轻度高斯滤波把最高频的噪声预滤掉。但要注意z 不能无限增大。当 z 大到一定程度图像会变得过于模糊细节丢失严重。我的经验是以图像中最细纹理刚好可见为临界点z 取临界值的 1.5 到 2 倍比较合适。5.3 相位解包裹出现跳变四步相移解出的相位是包裹在 [-π, π] 之间的如果场景中有大的相位梯度会出现 2π 跳变。对于图像增强来说这个跳变通常表现为突然的亮度反转。解决方法用skimage.restoration.unwrap_phase做相位解包裹。但要注意解包裹对噪声很敏感如果噪声太大解包裹反而会引入更多错误。我的建议是先做一次轻度降噪再解包裹最后再做一次导向滤波平滑。5.4 处理速度太慢怎么优化如果只是做单张图像增强80ms 的耗时完全可以接受。但如果你要处理视频流就需要优化。优化方向用scipy.fft替代numpy.fft速度能提升 20% 到 30%。如果分辨率很高可以先下采样再增强然后上采样回去。VEViD 对低频信息的增强是主要的下采样损失的高频信息本来也会被抑制。把相位因子的计算提前算好缓存起来如果处理的是同尺寸图像序列相位因子只需要算一次。5.5 常见问题速查表现象可能原因解决方法周期性条纹频率坐标错误检查 fftfreq 和 meshgrid噪声放大z 太小增大 z 或预滤波画面过糊z 太大减小 z色彩偏移RGB 分别处理改用 YCbCr 策略相位跳变包裹相位解包裹或导向滤波处理慢FFT 库效率低换 scipy.fft 或降采样6. 这套算法的适用边界与扩展方向6.1 什么场景下 VEViD 最合适根据我的实测VEViD 在以下几类场景中表现突出极低照度监控当环境照度低于 0.5 lux 时传统 ISP 的增益已经拉满噪声淹没信号。VEViD 通过虚拟衍射的低通特性能在增强信号的同时抑制噪声效果比单纯提增益好很多。强逆光场景画面中同时存在极亮和极暗区域时VEViD 的相位探测机制能同时保留两端的细节不会像 Gamma 校正那样顾此失彼。医学影像预处理X 光片、超声图像这类本身就依赖相位信息的成像模态VEViD 的相干探测机制有天然优势。6.2 什么场景下不建议用需要实时处理的高帧率视频虽然单帧 80ms 不算慢但如果你要跑 60fps还是得用更轻量的方案。彩色保真度要求极高的场景VEViD 对色度通道不做处理如果场景本身色彩丰富且对色彩准确性要求高可能需要额外的色彩校正。传感器固定模式噪声严重的场景VEViD 对随机噪声抑制效果好但对固定模式噪声比如热像素无能为力需要先做坏点校正。6.3 可以怎么扩展VEViD 的框架其实很开放有几个方向值得尝试多波长融合用不同波长跑多次虚拟衍射然后把结果融合。不同波长对细节的响应不同融合后可能获得更丰富的纹理。自适应参数选择根据图像的直方图分布或噪声估计自动选择 z 和 λ。这可以用一个轻量级的回归网络来实现输入是图像统计特征输出是参数。与深度学习结合把 VEViD 作为预处理模块后面接一个轻量级的 CNN 做后处理。VEViD 负责物理层面的增强CNN 负责风格化的调整。这样既能保证物理可解释性又能获得数据驱动的灵活性。扩展到三维成像虚拟衍射本身是三维传播过程如果输入是多视角图像理论上可以重建出场景的深度信息。这个方向跟光场成像结合会很有意思。6.4 我个人的使用体会用了几个月下来我最大的感受是VEViD 的价值不在于它在某个指标上刷了多高而在于它提供了一种可解释、可调节、可复现的增强范式。你不需要准备数据集不需要调网络结构只需要理解几个物理参数的含义就能针对不同场景快速适配。当然它也不是万能的。在光照条件尚可的场景下它的增强效果可能不如一个精心调参的曲线映射。但在极端条件下当数据驱动方法因为分布外问题而失效时VEViD 的物理先验就成了最后的防线。最后分享一个小技巧如果你手头没有合适的测试图可以用 OpenCV 的cv2.imread读一张正常曝光的图然后手动除以一个增益系数模拟欠曝再用 VEViD 恢复。这样你能直观看到它在不同欠曝程度下的表现也能帮你快速找到适合自己场景的参数范围。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑