1. 相位偏折测量技术概述
相位偏折测量(Phase Deflectometry)是一种基于条纹投影的光学三维测量技术,特别适用于镜面或半镜面物体的表面形貌检测。这项技术通过分析投射到被测物体表面的条纹图案的相位变化,来重建物体表面的三维形貌。
与传统的结构光三维测量相比,相位偏折测量具有几个显著优势:
- 对镜面反射表面有更好的适应性
- 测量精度可达亚微米级
- 能够同时获取镜面反射和漫反射分量
- 非接触式测量,不会损伤被测物体
在实际应用中,相位偏折测量系统通常由以下几个核心组件构成:
- 投影系统:用于投射正弦条纹图案
- 成像系统:采集被物体表面调制后的条纹图像
- 计算单元:处理图像并重建三维形貌
- 机械平台:固定被测物体和光学元件
2. 四步相移法原理与实现
2.1 相移法基本原理
四步相移法是相位偏折测量中最常用的相位提取算法。其核心思想是通过采集多幅(通常为4幅)具有固定相位差的条纹图像,来计算每个像素点的相位值。
数学上,投射的正弦条纹光强分布可以表示为:
I_n(x,y) = I_0(x,y) + I_m(x,y)cos[φ(x,y) + δ_n]
其中:
- I_n(x,y)是第n幅图像的强度
- I_0(x,y)是背景光强
- I_m(x,y)是调制幅度
- φ(x,y)是需要求解的相位
- δ_n是第n幅图像的相位偏移量(通常为0, π/2, π, 3π/2)
2.2 相位计算实现
在代码实现中,相位计算通常遵循以下步骤:
cpp复制// 初始化正弦和余弦分量矩阵
cv::Mat SinMat = cv::Mat::zeros(rows, cols, CV_32F);
cv::Mat CosMat = cv::Mat::zeros(rows, cols, CV_32F);
// 对四幅图像进行加权累加
for (int i = 0; i < 4; i++) {
cv::Mat image = cv::imread(imagePaths[i], cv::IMREAD_GRAYSCALE);
image.convertTo(image, CV_32F);
SinMat = SinMat + image * std::sin(i * PI / 2.0);
CosMat = CosMat + image * std::cos(i * PI / 2.0);
}
// 计算包裹相位
cv::Mat PhaMat;
cv::phase(CosMat, SinMat, PhaMat);
这段代码实现了四步相移法的核心计算过程,最终得到的PhaMat就是包裹相位图,其值范围在[-π, π]之间。
2.3 相位解包裹处理
由于反正切函数的周期性,直接计算得到的相位是包裹在[-π, π]区间内的,需要通过相位解包裹算法恢复连续的绝对相位。
代码中实现的一维解包裹算法如下:
cpp复制cv::Mat unwrapPhase(const cv::Mat& wrappedPhase) {
cv::Mat unwrapped = wrappedPhase.clone();
int rows = unwrapped.rows;
int cols = unwrapped.cols;
for (int r = 0; r < rows; r++) {
float phaseOffset = 0;
float prevVal = unwrapped.at<float>(r, 0);
for (int c = 1; c < cols; c++) {
float currVal = unwrapped.at<float>(r, c) + phaseOffset;
if (prevVal - currVal > PI) {
phaseOffset += 2 * PI;
currVal += 2 * PI;
} else if (prevVal - currVal < -PI) {
phaseOffset -= 2 * PI;
currVal -= 2 * PI;
}
unwrapped.at<float>(r, c) = currVal;
prevVal = currVal;
}
}
return unwrapped;
}
这个解包裹算法沿图像的行方向进行,通过检测相邻像素间的相位跳变(超过π)来添加或减去2π的整数倍,从而恢复连续的相位信息。
3. 系统实现与代码架构
3.1 整体处理流程
完整的相位偏折测量处理流程包括以下几个主要步骤:
- 图像采集:获取X和Y方向各4幅相移图像
- 相位计算:分别计算两个方向的包裹相位
- 相位解包裹:恢复连续相位
- 梯度计算:通过Sobel算子计算相位梯度
- 反射分量分离:提取镜面反射和漫反射分量
- 结果融合:合并两个方向的结果
- 后处理:滤波和平滑处理
3.2 核心数据结构
系统使用OpenCV的Mat类来存储和处理图像数据,主要的数据结构包括:
cpp复制// 输入图像
cv::Mat xImages[4]; // X方向4幅图像
cv::Mat yImages[4]; // Y方向4幅图像
// 中间结果
cv::Mat xWrappedPhase; // X方向包裹相位
cv::Mat yWrappedPhase; // Y方向包裹相位
cv::Mat xUnwrappedPhase; // X方向解包裹相位
cv::Mat yUnwrappedPhase; // Y方向解包裹相位
// 输出结果
cv::Mat fullPhase; // 融合后的完整相位
cv::Mat fullShape; // 重建的三维形状
cv::Mat fullSRC;
