news 2026/10/26 5:24:48

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于物理模拟的VEViD视觉增强算法:虚拟衍射与相干探测原理及实战

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-image:

pip install scikit-image

整个流程不需要深度学习框架,不需要 CUDA,一台普通笔记本就能跑。我实测在 i5-8250U 上处理 1920×1080 的灰度图,单帧耗时约 80ms,基本能满足实时预览的需求。

4.2 核心代码实现

下面是我整理的一个最小可运行版本,去掉了论文里的冗余封装,只保留核心逻辑:

import numpy as np import cv2 def vevid_enhance(img, wavelength=550e-9, distance=2e-3, pixel_size=5e-6, ref_amp=1.0, num_steps=4): """ VEViD 核心增强流程 img: 输入灰度图,float32,范围 [0, 1] wavelength: 虚拟波长,单位米 distance: 虚拟传播距离,单位米 pixel_size: 传感器像素间距,单位米 ref_amp: 参考光振幅倍数 num_steps: 相移步数 """ M, N = img.shape # 构造频率坐标 fx = np.fft.fftfreq(M, d=pixel_size) fy = np.fft.fftfreq(N, d=pixel_size) FX, FY = np.meshgrid(fx, fy, indexing='ij') # 角谱传播的相位因子 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, endpoint=False) 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)], axis=0)) # 归一化输出 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 移位没处理好。

排查步骤:

  1. 检查np.fft.fftfreq的参数是否正确,特别是d是否等于像素间距。
  2. 确认np.fft.fft2之后没有做多余的fftshift。角谱传播在标准 FFT 排列下就能工作,不需要移位。
  3. 如果条纹是斜向的,检查meshgrid的indexing参数。用'ij'对应 (M, N),用'xy'对应 (N, M),搞反了就会出现方向错误的相位因子。

我踩过的坑:有一次把indexing='ij'写成了默认的'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 恢复。这样你能直观看到它在不同欠曝程度下的表现,也能帮你快速找到适合自己场景的参数范围。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/26 5:24:28

EUPE:高效通用视觉感知编码器的原理与实践

1. EUPE项目概述:重新定义视觉感知编码在计算机视觉领域,感知编码器(Perception Encoder)一直扮演着"特征提取大脑"的角色。传统编码器往往针对特定任务(如分类、检测)单独设计,导致模…

作者头像 李华
网站建设 2026/10/26 5:24:10

ZYNQ PL纯硬件采集AD7606:绕过PS DMA实现1 MSPS确定性采样

简介:本资源是一套基于Xilinx ZYNQ SoC平台实现AD7606高精度ADC数据采集与实时FFT频域分析的完整FPGA工程,面向嵌入式系统开发工程师、数字信号处理学习者及高校FPGA课程实践者,解决高速模拟信号采集、PL端硬件协同控制与频谱分析落地难的问题…

作者头像 李华
网站建设 2026/10/26 5:23:51

纯C国密SM2/SM3/SM4源码包:密码改造编译对接与排错指南

简介:面向国密算法学习与工程落地的开发者,这份资料包围绕SM2椭圆曲线公钥密码、SM3杂凑算法和SM4分组密码展开,兼顾原理理解、代码实现与结果验证。包内共78个文件,约6.99MB,以C语言源码和头文件为核心,配…

作者头像 李华
网站建设 2026/10/26 5:23:05

深入解析Linux epoll与反应堆模式的高效IO处理

1. 反应堆模式与IO多路复用的本质联系在Linux网络编程领域,反应堆(Reactor)模式本质上是一种事件驱动的设计范式。它的核心思想可以用"非阻塞IO就绪通知"来概括——这正是IO多路复用技术要解决的根本问题。当我们在Linux内核中使用…

作者头像 李华
网站建设 2026/10/26 5:21:33

NVR嵌入设备Web程序:CGI、取流解码与二次开发实践

简介:这是一份从海康威视DS-8632N-ST网络硬盘录像机中导出的嵌入式WEB程序源码,面向需要研究NVR设备网页端实现、进行二次开发参考或Web安全学习的开发者与运维人员。官方固件通常只提供登录页面而不开放ASP源代码,因此该包可用于了解设备Web…

作者头像 李华
网站建设 2026/10/26 5:21:11

Python多智能体协作系统设计与实践

1. 为什么需要多智能体协作?在AI技术快速发展的今天,单个AI模型已经能够完成许多基础任务。但当我们面对复杂问题时,单一智能体往往力不从心。就像一支足球队需要前锋、中场、后卫各司其职一样,多智能体系统通过分工协作可以解决更…

作者头像 李华