
测量光学镜头的MTF(调制传递函数)和畸变率,需通过标准测试图案(如USAF分辨率卡),结合均匀光源、相机成像及图像处理算法,分析条纹对比度衰减(MTF)和位置偏移(畸变),关键步骤包括光源校准、图像采集、条纹提取与对比度计算(MTF),以及相机标定后目标点位置偏移计算(畸变),需关注光源均匀性、相机分辨率、测试卡匹配度及环境因素等误差来源。
类比:MTF像“信号传输的衰减曲线”,反映镜头对细节的保留能力;畸变像“图像的几何变形程度”,反映镜头的成像精度。
| 指标 | 定义 | 测量原理 | 关键步骤 | 误差来源 |
|---|---|---|---|---|
| MTF | 空间频率下,输出图像调制与输入调制的比值 | 输入100%调制的标准测试卡,测量输出调制随频率的变化 | 1. 均匀光源照射测试卡;2. 相机拍摄图像;3. 空间域带通滤波提取特定频率条纹;4. 计算条纹对比度并绘制曲线 | 光源不均匀(条纹对比度偏差)、相机噪声、相机分辨率不足(高频段误差) |
| 畸变率 | 像点偏离理想位置的最大偏移量(通常为像高的百分比) | 输入含不同位置目标的标准测试卡,测量位置偏移 | 1. 拍摄测试卡图像;2. 相机内参标定(畸变模型参数);3. 计算实际位置与理想位置的距离;4. 计算最大偏移量 | 测试卡标定误差、相机标定误差、图像噪声、镜头温度变化(畸变变化) |
import cv2
import numpy as np
def extract_stripe(image, freq, width):
"""空间域带通滤波提取特定频率条纹"""
filter = np.zeros_like(image, dtype=np.float32)
filter[:, int(image.shape[1]/2 - width/2): int(image.shape[1]/2 + width/2)] = 1.0
stripe = cv2.filter2D(image, -1, filter)
return stripe
def calculate_mtf(stripe):
"""计算条纹对比度(灰度值范围0-255)"""
mean_dark = np.mean(stripe[stripe < 128])
mean_light = np.mean(stripe[stripe >= 128])
return (mean_light - mean_dark) / (mean_light + mean_dark)
def calibrate_camera(calib_image):
"""用标定板计算相机内参(畸变模型参数)"""
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(calib_board, image_points, calib_image.shape[1:], None, None)
return mtx, dist
def measure_distortion(test_image, calib_mtx, calib_dist):
"""计算畸变率(最大偏移量百分比)"""
img = cv2.imread(test_image, cv2.IMREAD_GRAYSCALE)
corners = cv2.findChessboardCorners(img, (9,6), None)
if corners:
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(calib_board, image_points, img.shape[1:], calib_mtx, calib_dist)
undistorted = cv2.undistort(img, calib_mtx, calib_dist)
points = cv2.cornerSubPix(undistorted, corners, (11,11), (-1,-1), (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001))
ideal_points = np.array([[i, j] for i in range(9) for j in range(6)], dtype=np.float32)
distortions = np.linalg.norm(points - ideal_points, axis=1)
return np.max(distortions) * 100 # 转换为百分比
# 示例调用
freq_list = [1, 2, 4, 8, 16] # 空间频率(线对/毫米)
mtf_vals = []
for freq in freq_list:
stripe = extract_stripe(usaf_img, freq, 20) # 假设条纹宽度20像素
mtf_vals.append(calculate_mtf(stripe))
print("MTF曲线:", mtf_vals)
calib_mtx, calib_dist = calibrate_camera(calib_board_img)
distortion = measure_distortion(usaf_img, calib_mtx, calib_dist)
print("畸变率:", distortion, "%")
“在光学芯片测试中,测量MTF和畸变率通常通过标准测试图案(比如USAF分辨率测试卡)来实现。首先,MTF是衡量镜头传递图像细节(调制)的能力,测量时,我们用均匀光源照射测试卡,拍摄不同空间频率的条纹,计算每个条纹的对比度(输入调制为100%,输出是条纹亮暗的对比度),对比度随频率降低的衰减曲线就是MTF。关键步骤包括:光源校准(比如用积分球保证均匀)、拍摄图像、用带通滤波器提取特定频率的条纹、计算对比度并绘制曲线。然后,畸变率是镜头导致图像变形的程度,比如直线变成曲线,测量时通过测试卡中目标点的实际位置与理想位置的偏移计算。比如测试卡上有不同位置的圆点或十字,相机拍摄后,用标定好的相机内参校正畸变,计算每个点的偏移,最大偏移量就是畸变率。需要注意误差来源,比如光源不均匀会导致条纹对比度测量偏小,影响MTF结果;相机分辨率不足的话,高频率条纹无法分辨,导致MTF高频段测量值错误。另外,测试卡分辨率要匹配镜头性能,否则无法检测镜头的极限性能。”