ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

光学畸变与TV畸变:定义、测量方法与换算误区全解析

光学畸变与TV畸变:定义、测量方法与换算误区全解析 做镜头相关的工作这些年被问得最多的问题之一就是“光学畸变和TV畸变到底啥区别”。每次去客户现场十有八九会遇到这种场景——工程师拿着一份畸变测试报告说项目不达标结果仔细一查他看的是光学畸变的曲线客户规格书上明确写的是TV畸变。这两个概念只差两个字含义、测量方式、判定标准却完全不同用错了轻则多花一天排查重则直接影响产品放行和验收。今天就把这两个概念放在一起彻底掰开揉碎聊聊它们是什么、怎么测、怎么换算以及我在实际测试和镜头设计里踩过的那些坑。无论你是刚接触镜头测试的工程师还是正在选型、验收模组的项目负责人这篇内容应该能帮你少走不少弯路。1. 光学畸变的核心原理与典型形态1.1 畸变从哪来主光线与理想像面的偏差光学畸变Optical Distortion是光学系统像差中最特殊的一种。像球差、彗差、像散这些像差直接影响的是成像清晰度和点扩散函数人眼看到的是“糊”。而畸变不影响清晰度它影响的是点的位置——让图像里的直线变弯让正方形变成桶形或者枕形。严格来说畸变指的是主光线在像面上的实际交点位置与理想成像位置之间的偏差。所谓主光线就是经过入瞳中心的那条光线在实际光学系统里主光线经过各折射面后会逐步偏折最终的落点和近轴理想像点之间会有横向偏移。这个偏移量除以理想像高就是我们常说的光学畸变百分比D (Y_real - Y_ideal) / Y_ideal × 100%其中Y_real是实际像高即主光线在像面的实际交点与光轴的垂直距离Y_ideal是理想像高。如果D为负表示实际像高小于理想像高图像边缘向中心收缩这就是桶形畸变如果D为正表示实际像高大于理想像高图像边缘向外伸展也就是枕形畸变。这里有个细节需要注意光学畸变是按“视场位置”计算的不同视场角对应不同像高畸变值随像高变化。所以一条完整的光学畸变曲线是从中心到边缘逐步变化的过程中心视场的畸变通常为零或很接近零越往边缘畸变越大。测试报告上如果只给一个“畸变5%”的结论一定要问清楚是在哪个视场位置测的否则数据完全没法横向对比。在设计软件里光学畸变还有两种常见的表示基线F-Tan(Theta)畸变和F-Theta畸变。F-Tan(Theta)畸变以f×tan(θ)作为理想像高基准常规摄影镜头、监控镜头都按这种方式定义F-Theta畸变以f×θ作为理想像高基准主要用于扫描物镜、鱼眼镜头这类按角度投影的系统。拿到镜头设计图纸或者Zemax报告时先看清楚用的是哪种基线否则数值对不上排查起来很冤枉。1.2 桶形、枕形与S形畸变从畸变曲线的形状来看我日常工作中最常遇到的形态有三种。第一种是桶形畸变也就是负畸变。画面边缘的直线向中心收缩整个画面看起来像木桶的侧面广角镜头和超广角镜头最常见。因为广角系统普遍采用反远距结构后群负光焦度与保护玻璃、红外截止滤镜相互作用很容易引入较大的负畸变。手机超广角镜头的光学畸变经常做到-5%以下甚至-10%视觉上就是画面边缘的人、建筑全部往中心倾斜拍集体照时边上的人脸明显被拉窄这是很多旗舰手机超广角被吐槽最多的点。第二种是枕形畸变也就是正畸变。边缘直线向外膨胀画面四周看起来鼓出去。长焦镜头、望远系统容易出这种形态。变焦镜头在长焦端往往呈现正畸变短焦端呈负畸变中间某个焦段畸变最小所以变焦镜头的畸变曲线随焦距变化会很剧烈。第三种比较隐蔽叫S形畸变或者波浪形畸变。畸变曲线从中心到边缘先正后负或者先负后正。整体光学畸变数值看着不大但TV畸变可能超标因为曲线中间某段斜率大直线在特定视场位置被“掰弯”。这种畸变形态处理起来比单纯的桶形或枕形更棘手后续校正算法也更复杂。我见过一个镜头设计方案光学畸变全程不超过2%但TV畸变实测3.8%原因就是畸变曲线中部有一个很陡的拐弯直线弯曲的“加速度”过大。用一张表把常见形态的特征整理一下视觉特征和涉及场景一目了然畸变形态光学畸变符号视觉表现常见场景桶形D0直线向中心收缩画面呈桶状广角、超广角、手机主摄枕形D0直线向外膨胀画面呈枕状长焦、望远、部分变焦长焦端S形正负交替局部直线弯曲方向不一致大视场复杂结构、超广角后组设计光学畸变这个参数在镜头设计阶段是可控的。Zemax或者Code V里有专门的畸变操作数比如DIMX、DIST等设计时可以直接约束全视场或者特定视场的畸变上限。但要注意设计值是一回事量产实测是另一回事装配公差、镜片厚度误差、胶合偏差都会让实测畸变和设计值存在差异所以测试环节必不可少这也是为什么无论做得多好的镜头设计最终都躲不过一杆子畸变实测。2. TV畸变的定义与测量逻辑2.1 TV畸变从显像管时代传下来的概念TV畸变的全称是Television Distortion这个术语最早是从电视成像系统里来的。老式显像管是光栅扫描成像电子束偏转的非线性会直接造成画面几何变形所以在显像管生产线上需要用一个直观的指标来衡量“画面直线到底弯了没有”于是就有了TV畸变。到今天显像管早就没了但“TV畸变”这个名字被延续了下来在相机模组、安防监控、车载摄像头、内窥镜镜头的规格书上频繁出现。它的定义也逐步统一为在成像传感器有效画面的边缘位置一条本应笔直的直线因为畸变而产生的最大弯曲量ΔH除以画面的单边高度H再换算成百分比TV Distortion ΔH / H × 100%用大白话说就是把测试卡上的一条直线放在画面边缘看成像之后它弯了多少。弯曲量越大TV畸变越大观感上直线越扭曲。这个指标其实更贴近用户的实际视觉感受毕竟大家拍照、看监控、用倒车影像感知到的就是“直线弯不弯”而不是“某个像点的理论位置偏了多少”。有一个经常被忽略的点TV畸变测量的是单边高度内的相对弯曲。也就是说如果画面竖直方向高度是10mm边缘一条水平直线最大弯了0.2mm那么TV畸变就是0.2 / 10 2%。但这里H取的是单边高度还是整个高度不同公司定义不完全一样有的取全高10mm有的取半高5mm算出来结果差一倍。读取别人的测试报告时务必先确认清楚基准不然连数值都没法讨论。从测量方法上看TV畸变通常用专用的TV畸变测试卡来测。测试卡上会有等间距的水平和垂直线条把卡放在镜头前方拍摄后看画面最边缘位置的水平线和垂直线的弯曲量。有些高级测试卡的线条宽度和间距都有严格公差卡本身很贵但数据处理简单。便宜的方案是打印棋盘格卡配合算法自动检测直线这个后面实操部分细讲。2.2 光学畸变与TV畸变的关系和换算误区光学畸变和TV畸变在数学上是有关联的但不是简单的线性对应。光学畸变是逐点定义的函数每一条视场光线都对应一个畸变值TV畸变是在图像边缘空间里对畸变曲线的一个“积分效果”指标。实际工程中常用一个经验结论来粗略换算在畸变曲线比较平滑、近似二次抛物线形态的前提下TV畸变约为光学畸变最大值的0.4~0.7倍。比如光学畸变最大5%的桶形畸变TV畸变通常落在2%~3.5%这个区间。我拿一个实际项目举例。某手机广角镜头光学畸变最大值-6.2%出现在最大视场角位置实测TV畸变是-3.6%。按经验系数0.58估算6.2%乘以0.58约等于3.6%和实测值吻合得不错。但换另一个S形畸变镜头光学畸变最大值只有2.1%TV畸变却测出2.8%光学畸变更小TV畸变反而更大。问题就出在畸变曲线中部有一段斜率很陡的区域直线在中间视场就被明显掰弯到边缘区的弯曲量反而被“掰回来”了一点。这种情况下光学畸变和TV畸变的经验换算完全失效。所以拿光学畸变报告除以2就当TV畸变用这种事我劝大家千万别干。这种换算只能用来做方案预研的量级判断不能作为验收依据。在具体项目里光学畸变和TV畸变的使用场景也有分工。镜头设计阶段和光学仿真报告里通常用光学畸变来描述像差水平镜头厂出货检、模组厂来料检、整机厂图像测评环节更常用TV畸变来判定画面直线是否满足要求。规格书里如果混淆了这两者后期扯皮的概率非常高。3. 畸变测试的完整实操流程3.1 测试设备、测试卡选择与环境准备测畸变说难不难说简单也不简单。最容易翻车的环节不是计算而是测试环境和测试卡的准备。测试卡方面常用的有三类点阵卡、棋盘格卡、直线卡。点阵卡适合做光学畸变逐点测量棋盘格卡适合做相机标定和软件自动计算畸变系数直线卡尤其是TV畸变测试卡适合做TV畸变直接读数。我自己常备的是A4幅面的高精度棋盘格表面需要平整无折痕最好覆一层哑光膜避免反光影响角点检测。在300mm以内的工作距离下这种卡完全够用。测试环境有四个要点前面任何一条没做到位数据都可能废掉。第一测试卡平面与镜头光轴要尽量垂直。稍微歪一点畸变读数就会混入透视变形。尤其远心度不好的镜头一点倾斜就能让直线看起来是弯的这个误差极其隐蔽。我见过有人折腾半天数据不稳定最后发现是测试卡用胶带贴墙墙面本身就不平。固定测试卡建议用磁性支架或者带锁紧机构的升降台保证卡面平整且可复现。第二照明要均匀。边缘亮度不足会导致算法检出直线或角点失败必要时要用匀光板或积分球在低照度场景下尤其重要。用手机摄像头测试时很多镜头边缘有严重暗角卡面边缘和中心的亮度差达到几个EV这时候直接用原图检测边缘的棋盘格角点十有八九会丢。第三对焦要精准。对焦不准虽然不影响畸变数值本身但边缘模糊会让直线检测算法丢失亚像素精度最终读数偏大或者抖动。我习惯用中心清晰度和边缘线条同时判定确保整个画面边缘都在可接受的模糊范围内再开始采集正式数据。第四记录镜头工作距离。同一个镜头在0.3m和无限远物距下的畸变不一样尤其定焦广角镜头近摄时畸变会明显变化。如果一份报告没写物距这份报告的数据就无法复现。有条件的话最好用平行光管把目标等效到无限远测出来的才更接近设计值对应的工作状态。提示无论用哪种测试卡测试前都要确认卡面本身是否存在打印变形。普通喷墨打印的A4卡片纸张受潮或打印机进纸偏差都可能让方格不水平这种情况下测出的畸变值不可信。高要求的测试场景建议采购印刷精度有保障的商用测试卡。3.2 从拍摄到数据输出图像检测与计算公式实际操作中光学畸变和TV畸变的读数一般靠软件处理。我常用的方案是Imatest和OpenCV组合大厂实验室用Imatest的居多算法成熟输出报告规范客户也认。但Imatest的License费用不低小团队不一定买。更经济的方案是自己在Python里用OpenCV做标定和测量逻辑并不复杂。import cv2 import numpy as np # 读取棋盘格图像 img cv2.imread(checkerboard.png) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 棋盘格内角点数宽, 高根据实际测试卡规格修改 pattern_size (9, 6) # 检测角点 ret, corners cv2.findChessboardCorners(gray, pattern_size, None) if ret: # 亚像素精化提升角点坐标精度 criteria (cv2.TERM_CRITERIA_EPS cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) corners cv2.cornerSubPix(gray, corners, (5, 5), (-1, -1), criteria) # 生成理想棋盘格三维坐标 objp np.zeros((pattern_size[0] * pattern_size[1], 3), np.float32) objp[:, :2] np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2) # 正式标定需要多张不同姿态的棋盘格图像这里用单张示意 # 实际项目请采集10~20张不同角度、不同距离的图像再标定 ret, mtx, dist, rvecs, tvecs cv2.calibrateCamera( [objp], [corners], gray.shape[::-1], None, None ) # dist[0]中包含k1, k2, p1, p2, k3径向畸变重点关注k1和k2 print(dist:, dist)代码里最关键的是dist系数它包含径向畸变k1、k2、k3和切向畸变p1、p2。光靠k1、k2就能换算光学畸变曲线但TV畸变更适合在像素域里直接测直线弯曲。做法是检测棋盘格边缘的直线拟合出理想直线统计边缘位置的最大偏离量再除以像高直接算出TV畸变。拟合直线时有一个非常容易范的错误如果只取画面中心附近的直线畸变影响不明显算出来的TV畸变会偏小很多。必须取画面边缘两端的直线比如最上面一排和最下面一排的水平线弯曲量才足够大。画面边缘也就是视场角最大区域的直线才是TV畸变真正关心的位置。数据处理这一步最容易出的问题是角点检测失败。棋盘格如果受环境光干扰或者印刷精度不够检测到的角点会有一两个坏点直接拉偏标定结果。我的经验是先目视检查检测结果把明显错误的角点手动删除或者多拍几张重新检测不要硬着头皮跑算法。自动化工具输出的数字再漂亮也替代不了人对原始图像质量的判断。4. 测试中的常见问题、坑与设计控制思路4.1 容易读错数、测不准的几类情况先说第一类物距变化导致读数漂移。这个我踩过很多次。工业相机镜头、车载镜头、内窥镜镜头在不同工作距离下畸变差异可能很大。特别是反远距结构的广角镜头近摄时畸变和无限远时差别明显。我遇到过一款5mm焦距的广角镜头0.3m物距下TV畸变实测-4.2%改装到平行光管等效无限远物距后变成-3.1%差了整整一个百分点。所以测试报告务必注明物距跨批次对比时固定同一物距才有效。第二类是边缘亮度太低导致直线检测失败。很多手机模组测试时镜头边缘暗角严重画面边缘的直线在图像里已经降到接近噪声水平算法直接报错。遇到这种情况先用均值归一化把图像亮度拉平或者在检出直线前对图像做直方图均衡让边缘区域信噪比上来再检测。暗角造成的边缘对比度下降本身也会让直线看起来“变淡”但要注意区分暗角是亮度变化不影响畸变数值只影响检测成功率。第三类是光学畸变报告与TV畸变混用产生的误会。这就是文章开头说的场景。我见过不止一次光学畸变曲线最大到5%规格书TV畸变不大于3%怎么测都不合格。后来发现规格书里的“畸变”单位是TV Distortion设计报告里却是Optical Distortion两边差了将近一倍。建议所有项目在规格书源头把指标定义写死比如“TV畸变以画面单边高度为基准≤3%”不给解读留空间。第四类是温度漂移。对车载和安防镜头来说这个坑特别明显。温度从25°C升到85°C镜筒、镜片的间距热胀冷缩主光线偏折角跟着变化畸变能漂移零点几个百分点。有些镜头设计做过热补偿畸变漂移能压到很小有些没有。量产测试如果横跨冬夏两个季节同一批镜头的数据可能不一致建议在规格书上明确温度条件测试时尽可能在恒温环境完成。我比较过同一批车载镜头在25°C和65°C下的TV畸变最大偏差达到0.8%这个量级在中低畸变要求的产品上足以影响合格率判断。4.2 从镜头设计端控制畸变的几个思路如果你不只是测畸变而是参与镜头设计或者光学评审下面这些控制思路应该用得上。最经典的手段是采用对称或近对称的光学结构。畸变本质上来源于主光线经过透镜组后的非对称偏折对称结构能天然抵消一阶畸变项。双高斯镜头比单组透镜的畸变小很多就是结构上对称性的功劳。设计一个6片球面定焦镜头初始结构如果从对称的双高斯出发畸变控制会比从非对称的长工作距结构出发容易得多。第二是光阑位置的选择。光阑对主光线路径有决定性影响光阑前后透镜的畸变贡献方向往往相反调整光阑位置可以平衡正负畸变。设计广角镜头时光阑后移通常会让负畸变变大光阑前移则会让边缘光线更容易被拉弯要反复权衡。我做一个4片式广角镜头时光阑位置微调0.3mm边缘畸变从-8%改善到-5%但同时场曲恶化了0.05mm最后只能在畸变和场曲之间取一个平衡值。第三是非球面的使用。非球面镜片对畸变校正非常有效一片高次非球面的畸变校正能力抵得上好几片球面镜。现在手机镜头动不动就上6片非球面很大一部分原因就是要在小体积、大视场条件下压住畸变。但仿真时要留意非球面高阶项过大可能引发的工艺敏感问题否则设计值再好量产面形偏差一大就全废了。联系到实际很多光学设计第一次试做出来的实测畸变和设计值差很多追根溯源往往不是设计错误而是非球面面形检测和实际加工存在偏差。第四是在Zemax或Code V里直接约束。设计中期就要把畸变作为显式操作数加入优化而不是等像差平衡后才发现畸变超标。设置操作数时除了约束最大视场畸变值也要约束边缘倒数第二个视场的畸变斜率防止S形畸变曲线悄悄出现。有些设计软件默认优化函数里畸变权重不高不加显式约束的话优化的结果很容易出现高阶畸变被放大、数值看着不大但直线已经弯掉的情况。最后分享一点干活体验。无论是光学畸变还是TV畸变本质上都在衡量同一个东西——镜头成像时把直线“掰弯”的程度只是看的角度不一样。光学畸变是光学设计的语言TV畸变是产品验收的语言做工程的人最要紧的是把语言统一好。我自己现在写任何规格书或测试方案第一件事就是把畸变的定义、测量基准、物距、温度条件全部写清楚免得后续扯皮。测试时也尽量用同一套软硬件环境做横向对比数据一致性远远比追求某一次测试的理论精度更实用。这条经验如果能帮你少开几次那种“数据对不对得上”的项目会这篇内容就算值了。
返回列表