简介:这份资源面向光学与数字全息方向的学习者和研究者,提供MATLAB环境下三种数字全息重构方法的实现代码,帮助理解从全息图恢复原始光场信息的基本流程。包内共3个m文件,压缩包约1KB,分别对应基于卷积的重构、基于Fresnel变换的重构以及角谱法重构,覆盖近场、中等距离到远场等不同传播条件下的典型算法思路。基于卷积的方法通过光学传递函数卷积实现近场重建,计算相对简单;Fresnel变换方法引入传播距离,在有限空间分辨率下可获得较好结果;角谱法则借助傅里叶变换与频域位相恢复,适合处理远场物体。三者各有优劣,选择取决于重构距离、计算复杂度与精度需求。已有1643人学习下载,适合作为数字全息入门实验与光学信号处理实践的参考脚本,便于对比不同重构方法的实现差异与适用场景。
1. 数字全息重构:为什么同一张全息图能算出三种不同的像
一张数字全息图,本质上只是一片记录了干涉条纹的灰度矩阵。但把这片矩阵丢给不同算法,出来的像在分辨率、景深、噪声表现上能差出一大截——这不是玄学,而是因为「重构」这一步在数学上本来就有多条路径。卷积法(CONV)、菲涅耳变换法(fresnel)、以及基于角谱的重构,各自对应不同的传播近似和计算结构,选错了方法,边缘会糊、尺度会错、甚至出现本不该有的振铃。
数字全息重构方法之所以值得搞懂,是因为它决定了你从同一份原始数据里能榨出多少信息。搞懂 CONV 和 fresnel 的底层差异,你才知道什么时候该用 FFT 加速、什么时候必须补零、什么时候重建距离一改结果就崩。这份 MATLAB 代码把三种重构路径摆在一起,正好是拆解这套机制的绝佳样本。
2. 从全息图到复振幅:重构到底在算什么
2.1 全息记录的本质是干涉,重构的本质是衍射
数字全息的第一步是记录。物光波和参考光波在传感器平面上叠加,形成干涉图样,传感器只记录强度,相位信息被「编码」进条纹里。这一步的物理模型可以写成:
I(x,y) = |O|² + |R|² + O·R* + O*·R前两项是直流分量,后两项才是真正携带物光相位信息的干涉项。重构要做的,就是从这四项混在一起的强度图里,把O单独拎出来。
拎出来的手段是数值衍射。把全息图当作一个衍射孔径,用参考光的共轭去照射它,然后在某个重建距离上计算衍射场。这个衍射场的计算方式,就是三种重构方法的分水岭。常见的实现思路是:先把全息图乘以参考光共轭完成解调,再选择一种传播算子把光场从传感器平面推到像平面。
2.2 传播算子决定了重构的「性格」
不同重构方法的差异,归根结底是传播算子不同。菲涅耳近似把球面波前的二次相位因子做泰勒展开,只保留到二次项,得到的是一个卷积形式:
U(x,y;d) = exp(jk d)/(jλd) · ∫∫ U₀(ξ,η) · exp(jk/(2d)·((x-ξ)²+(y-η)²)) dξ dη这个式子可以拆成一个傅里叶变换加一个二次相位因子,所以菲涅耳法能用一次 FFT 搞定,速度快。但它有适用条件:重建距离不能太短,采样间距和波长要满足菲涅耳数远大于 1。距离一短,近似失效,像就散了。
卷积法(CONV)走的是另一条路。它不对方程做菲涅耳近似,而是直接把衍射积分当作一个线性卷积,用传递函数在频域做乘法:
U(x,y;d) = IFFT{ FFT{U₀} · H(fx,fy) }其中H是角谱传递函数。这样做的好处是重建距离可以很短,且像的尺度不随距离变化——菲涅耳法重建出来的像,像素物理尺寸会随距离缩放,卷积法不会。代价是计算量更大,而且传递函数在频域的高频部分容易引入混叠。
2.3 三种方法在代码里的分叉点
这份 MATLAB 代码的结构很清晰:读入全息图、做预处理、然后分三条支路调用不同的重构函数。三条支路共享同一份预处理结果,只在传播算子处分叉。这种组织方式的好处是,你可以用同一张图直接对比三种方法的输出,不用改数据。
预处理通常包括去直流和切趾。去直流是为了压掉|O|² + |R|²这两项,否则零级衍射会盖住重建像。切趾是给全息图加一个平滑窗,减少边缘突变引起的衍射条纹。这两步做完,才轮到传播算子登场。
3. CONV 重构:为什么它不怕短距离,却怕混叠
3.1 卷积法的数学结构
卷积法的核心是把衍射传播写成一个空间不变的线性系统。在频域里,这个系统的传递函数是:
H(fx, fy) = exp(j·2π·d/λ · sqrt(1 - (λfx)² - (λfy)²))当(λfx)² + (λfy)² > 1时,根号里变成负数,传递函数变成衰减的倏逝波。在数值实现里,这部分必须被截断,否则会出现数值爆炸。MATLAB 代码里通常用一个条件判断把高频部分置零或做带限处理。
% 角谱传递函数计算(卷积法核心) fx = (-N/2:N/2-1) / (N*dx); % 频率轴 [FX, FY] = meshgrid(fx, fx); arg = 1 - (lambda*FX).^2 - (lambda*FY).^2; H = exp(1j * 2*pi * d / lambda * sqrt(arg)); H(arg < 0) = 0; % 截断倏逝波,防止数值爆炸 U_recon = ifft2(fft2(U0) .* H); % 频域乘法完成卷积这段代码里,arg < 0的处理是关键。如果不截断,sqrt会返回复数,传递函数的模会指数增长,重建结果直接变成噪声。截断的代价是丢失了高频细节,但这是数值实现的必要妥协。
3.2 重建距离与采样约束
卷积法的一个硬约束是采样定理。传递函数的相位变化率必须小于 π,否则频域采样不足,会出现混叠。这个约束可以写成:
d ≤ N · dx² / λ其中N是像素数,dx是像素间距,λ是波长。举个例子,N=1024、dx=5μm、λ=632.8nm,算出来d ≤ 40mm左右。超过这个距离,卷积法就开始出问题,重建像上会出现周期性条纹——这是频域混叠的典型表现。
注意:卷积法的重建距离上限和菲涅耳法的下限往往有重叠区。在这个重叠区里,两种方法都能用,但结果会有细微差异。选哪个取决于你更在意尺度稳定性还是计算速度。
3.3 补零与像场尺度
卷积法还有一个容易被忽略的细节:FFT 的循环卷积特性。如果不补零,重建像的边缘会「绕回来」叠加到另一侧,形成鬼影。MATLAB 代码里通常会把全息图补零到两倍尺寸再做 FFT,算完再裁回原尺寸。
Npad = 2 * N; % 补零到两倍 U0_pad = zeros(Npad, Npad); U0_pad(1:N, 1:N) = U0; % 原始数据放在左上角 % ... 后续 FFT 和乘法都在 Npad 尺寸下进行 U_recon = U_recon(1:N, 1:N); % 裁回原尺寸补零的代价是计算量变成四倍,但换来的是干净的边缘。如果重建距离较短、像场集中在中心,不补零也能凑合;但只要像场接近边缘,鬼影就会很明显。
4. 菲涅耳重构:一次 FFT 背后的近似代价
4.1 菲涅耳近似的适用边界
菲涅耳法把传播距离假设为「足够远」,远到球面波的二次相位可以近似为抛物面。这个近似的数学表达是:
sqrt(1 - (λfx)² - (λfy)²) ≈ 1 - (λfx)²/2 - (λfy)²/2这个近似成立的条件是(λfx)² + (λfy)² << 1,换算到空间域就是菲涅耳数N_F = a²/(λd) >> 1,其中a是孔径尺寸。菲涅耳数越小,近似误差越大,重建像的相位误差就越明显。
在 MATLAB 代码里,菲涅耳重构通常写成:
% 菲涅耳变换法重构 k = 2*pi/lambda; % 预乘二次相位因子 U0_phase = U0 .* exp(1j*k/(2*d) * (X.^2 + Y.^2)); % 一次 FFT 完成衍射计算 U_recon = exp(1j*k*d)/(1j*lambda*d) * exp(1j*k/(2*d)*(X.^2+Y.^2)) ... .* fftshift(fft2(fftshift(U0_phase)));这里有两个二次相位因子:一个预乘在输入上,一个后乘在输出上。中间的 FFT 完成了从空间域到频率域的映射。整个计算只需要一次 FFT,速度比卷积法快得多。
4.2 尺度因子:菲涅耳法最容易被忽略的坑
菲涅耳法重建出来的像,像素物理尺寸和原始全息图不一样。重建像的像素尺寸是:
dx_recon = λ · d / (N · dx)这意味着重建距离d一变,像的尺度就跟着变。如果你要做定量测量——比如测细胞直径、测颗粒间距——必须把这个尺度因子算进去,否则数据全错。卷积法没有这个问题,它的重建像像素尺寸始终等于dx。
% 菲涅耳法重建后的像素尺寸计算 dx_recon = lambda * d / (N * dx); % 如果要做定量测量,所有空间坐标都要乘以这个因子 x_recon = (-N/2:N/2-1) * dx_recon;这个尺度因子是菲涅耳法的「性格」决定的:它把衍射场映射到了一个缩放后的坐标系里。用的时候必须心里有数。
4.3 零级项与共轭像的干扰
菲涅耳法重构出来的结果里,除了真正的重建像,通常还有零级衍射和共轭像。零级项在中心,共轭像在对称位置。如果预处理没做好,这三者会叠在一起。
常见的处理手段是频域滤波:把全息图做 FFT,在频域里找到干涉项对应的旁瓣,用一个掩膜把它单独提取出来,再移回中心。这一步做完,零级项和共轭像就被滤掉了,重建结果干净很多。
% 频域滤波提取干涉项 H_fft = fftshift(fft2(U0)); % 假设旁瓣在频域的某个位置,用圆形掩膜提取 mask = ((FX - fx0).^2 + (FY - fy0).^2) < R^2; H_filtered = H_fft .* mask; U0_filtered = ifft2(ifftshift(H_filtered));掩膜的半径R和中心位置(fx0, fy0)需要根据实际条纹频率来调。调小了丢细节,调大了滤不干净。
5. 避坑与排查:三种重构方法最容易翻车的地方
5.1 重建距离设错,像直接消失
现象:重建结果是一片均匀灰度,或者只有零级亮斑,看不到物像。原因:重建距离d和实际记录距离不匹配。菲涅耳法对距离尤其敏感,距离偏太多,像会散到整个视场外。解决:先用一个已知尺寸的样品标定实际记录距离,或者做距离扫描——把d在一个范围内遍历,用清晰度评价函数(如梯度平方和)找峰值。
5.2 卷积法出现周期性条纹
现象:重建像上叠加了规则的明暗条纹,条纹间距和 FFT 尺寸相关。原因:频域混叠。重建距离超过了采样约束d ≤ N·dx²/λ,传递函数相位变化太快,频域采样跟不上。解决:要么减小重建距离,要么补零增大N,要么换用菲涅耳法(如果距离在菲涅耳近似适用范围内)。
5.3 菲涅耳法重建像尺寸不对
现象:重建出来的物体比预期大或小,和实际尺寸对不上。原因:忽略了菲涅耳法的尺度因子dx_recon = λd/(N·dx)。解决:在做定量测量前,先算一遍尺度因子,把所有空间坐标换算过去。或者改用卷积法,它的尺度是 1:1 的。
5.4 零级项盖住重建像
现象:重建像中心有一个亮斑,把物像遮住了。原因:全息图的直流分量没有去掉,零级衍射在重建平面上聚焦成一个亮斑。解决:预处理阶段做去直流——可以减去全息图的均值,也可以在频域用高通滤波把低频分量压掉。
5.5 补零后忘记裁回原尺寸
现象:重建结果尺寸是原始全息图的两倍,后续处理全部错位。原因:卷积法补零后做 FFT,算完没有裁回原尺寸。解决:在卷积法的最后一步加裁切操作,把结果裁回N×N。如果做的是多步迭代重建,每一步都要检查尺寸是否一致。
6. 三种重构方法的设计取舍:没有最优,只有最合适
把 CONV 和 fresnel 放在一起看,会发现它们的设计取舍几乎是互补的。菲涅耳法用近似换速度,一次 FFT 就能出结果,但代价是尺度随距离变化、短距离失效。卷积法不做近似,尺度稳定、短距离可用,但计算量大、有混叠风险。这不是谁比谁好的问题,而是你的应用场景更在意哪个指标。
| 维度 | 菲涅耳法 | 卷积法 |
|---|---|---|
| 计算量 | 一次 FFT | 两次 FFT + 频域乘法 |
| 重建距离范围 | 中远距离 | 短距离到中距离 |
| 像场尺度 | 随距离缩放 | 固定 1:1 |
| 混叠风险 | 低 | 距离超限时高 |
| 适用场景 | 快速预览、远场重建 | 定量测量、短距离重建 |
我一般会这么理解:菲涅耳法是「够用就行」的工程选择,卷积法是「要准就得付代价」的物理选择。如果你只是想做快速预览、看看全息图里大概记录了什么,菲涅耳法足够了。但如果你要做颗粒追踪、细胞形态测量、或者任何需要精确空间坐标的分析,卷积法的尺度稳定性就是刚需。
还有一个容易被忽略的维度:重建距离的连续性。菲涅耳法在距离连续变化时,像的尺度也在连续变化,做自动对焦时评价函数的曲线会比较平滑。卷积法的尺度不变,自动对焦的评价函数在焦点附近更尖锐,但对焦范围更窄。这两种「性格」直接影响你选什么对焦算法。
从那以后我每次拿到一份新的全息数据,都会先用菲涅耳法快速扫一遍距离,找到大致焦点位置,再切到卷积法做精细重建和定量分析。这个习惯帮我省了很多来回试错的时间。希望帮到你。
本文还有配套的精品资源,点击获取