关于镜头畸变问题的总结

news2025/1/12 4:49:00
1、问题背景
最近在做的项目有畸变校正的需求,但测试镜头畸变时,发现畸变的形态不太正常。如下图所示中间向内凹、四周向外凸,感觉像是曲线型的。但常见的畸变就两种,一种是向内收的枕形畸变,另一种是向外凸的桶形畸变,所以本篇文章主要是对这个问题做一个分析,以及总结一下什么是畸变、畸变是怎么产生的、畸变的计算。
2、问题分析
关于畸变,是属于像差的一种,肯定是和镜头相关的。遇到我上面的问题具体该怎么处理呢?最简单的方法就是对着图卡(一般是点阵图/棋盘格)去拍 raw 图,将有问题现象的 raw 图反馈给镜头厂去确认。
一开始我是給的上面点阵图的那张 raw,他们反馈看现象是不太正常,但说我拍歪了,让再摆正重新拍一张。随即又拍了张摆正的解析力卡的 raw 给他们,因为是确认边缘直线变曲线的问题,所以用其他图卡能复现现象也行。
如下是这颗模组的规格,反馈说是这颗镜头的视场角是120度,属于广角镜头,只要畸变<10.5%就是正常的,确实短焦距的广角镜头是会容易出现明显的桶形畸变,但目前看到的这种曲线的畸变,就不太确定是什么了。
镜头厂那边实测,模拟给出的结论就是桶形畸变,也是满足镜头的设计要求的。并做了如下解释,如下图所示是反映镜头畸变的曲线图、网格图。从畸变曲线看,是单调递增的,且是负值,所以是单纯的桶形畸变。
曲线图上,在 2.2mm像高内,畸变都比较小,2.2mm 开始,畸变就变的比较大,应该是内视场畸变和外视场畸变差异过大导致的视差。
我的理解是类似于在一个一圈一圈的圆环里面画直线,会感觉直线变形了一样。
如上网格图也是一样,内视场的畸变很小,而到边角部分的畸变明显变大所以视觉上就感觉中间不直了一样。
3、知识延申:关于畸变的相关概念
a、什么是畸变
畸变是指物体所成的像在形状上的变形,它并不会影响像的清晰度,而只影响像与物的相似性。如下示意图所示,常见的畸变类型有桶形畸变和枕形畸变。
那什么时候是桶形畸变,什么时候又是枕形畸变呢?以如下简单的示意图为例,将靠近镜头中心部分所成的像视为内视场(y1),边缘部分为外视场(y2)。当内视场的放大倍率 :y1/h1 > 外视场的放大倍率:y2/h2时,所成的像是从中心是往外放大的,也就是桶形畸变。 反之则是枕形畸变。
而具体出现桶形畸变还是枕形畸变,取决于光圈的位置,当光圈在透镜前面或后面时,会限制光线的行为。
当光圈在镜头前面,像的高度减小了,也就是像缩小了,就造成了桶形失真。复杂的镜头,例如后焦距广角镜头,往往就会出现桶形失真,因为前组镜头会充当后组的光圈。
当光圈在镜头后面,像的高度增加了,也就是放大了,就是枕形失真。远焦镜头的后组为负,会导致枕形失真。
下面这幅图片是对应的三维图,更加清晰的看出光圈与镜头的关系。
b、畸变产生的原因
从上面的概念我们了解到,畸变产生的根本原因是镜头像场中央区的放大倍率和边缘区的放大倍率不一致导致, 那为什么不一致呢?
请看如下这个光路图,A和B一个是轴上点,一个是轴外点。过B点作辅助光轴,也就是这个虚线,与像面交于B0′,B0′点即为B点的理想像点。另一方面,B点若是以细光束成像,则像点是B′点,注意,细光束成像是没有球差和慧差的,但是有场曲,所以B在细光束下成像像点实际在B', B′B0′为B点的场曲。
当B点以主光线成像时,看黄色主光线,这时注意,主光线是宽光束,存在球差和慧差,所以宽光束成像时,黄色主光线交辅轴于B1′点,所以B1′B′为B点的球差。
所以,综合球差慧差场曲的影响,主光线最终经B1′点交像面于Bz′点,那实际像点Bz’就偏离了理想像点B0′。再看看位于光轴上的A点,主光线与光轴重合,主光线的像点与理想像点在像面的中心点A′重合,因此轴上点成像没有偏差,但是轴外点的像高和理想像高有差异,造成中心和边缘的放大倍率不同,这就产生了畸变。所以,由以上分析可以看出,畸变的形成既有场曲的因素也有球差的因素。
注: 篇幅有限,这里就不再解释关于球差,慧差,场曲的概念了,后续文章会再单独描述;
c、关于畸变的计算
再回到上面镜头的spec,描述了镜头的 TV 畸变是10.5%,光学畸变是20%, 那这两者的区别是什么,具体是 如何 计算的?
1)、关于光学畸变:
光学畸变是对应镜头的指标,描述的是物体所成像的理想位置和实际位置的偏差,如下光路图中的轴外一点B,实际像点Bz',理想像点为B0′。可以用理想像高y’,和实际像高 yz’ 的比值来描述偏离程度,
公式为:( yz'-y' ) / y' x 100%
可以用此项目中的镜头规格来做具体的验证,镜头的光学畸变是随视场范围变化而变化的,所以规格书给出的20%是最大的光学畸变值,所以我们要计算出最大的理想像高,也就是计算当是最大视场范围时成像时的理想像高是多少。
最大的视场角如上规格书,对角线方向的 FOV 值为120° (如下图 ɵ = 60° ),焦距 f 是2.13mm,理想像高为:tan 60° x 2.13 = 3.689mm;
而最大实际像高就是 sensor 对角线长的一半:5.867 / 2 = 2.934mm;
则镜头最大光学畸变为:(2.934-3.689)/ 3.689 x 100% = - 20% ;
2)、关于 TV 畸变:
TV 畸变是对应所拍摄出的图片而言的,体现图像的变形程度,我们平常用 imatest 软件所测试的就是TV畸变的值。 TV 是 Transverse Vertical,横向竖向的意思。
关于TV畸变的计算它有SMIA 和 Traditional TV distortion 两种,如下示意图所示:
SMIA TV Distortion = 100% * ( A-B )/B ; A = ( A1+A2 )/2
Traditional TV distortion = 100% * ∆H/H
如上 SMIA TV Distortion 计算中, A = ( A1+A2 )/2 = H+2 ∆H,B = H,则 100% *(A-B)/B = 2 ∆H/H,所以  SMIA TV Distortion = 2x  Traditional TV distortion。
还是以此项目中用到的镜头来做具体的验证,规格书中给出的TV 畸变值是10.5%,且是SMIA TV 畸变;
如下是实拍的棋盘格的图,用来计算 SMIA TV畸变,拍两条横向直线,让他们与图像的上下边相切。两条直线与图像左侧相交,得到两个坐标,计算出纵向像素差A1。同样的方法可以得到右侧的纵向像素差A2。两条直线间的距离就是图像的高B,畸变值就是((A1+A2)/2 - B)/B。
用画图工具打开后,就可以得到每个点的像素位置,如下图的坐标所示,先算出左侧的像素差(2944-176=2768),右侧的像素差(2937-169=2768),中间的像素差为3120,可以计算出畸变值为:((2768+2768)/2 - 3120)/3120 = -11.2%),结果有点误差,但也不大,实际测试一般都是用 imatest 软件去计算,能了解一下具体是怎么计算的就可以了。
参考文章:
镜头畸变的那些事 | 清新的日子
光学畸变和TV畸变的换算方法 - 百度文库
光语者-摄影光学与镜头_中国刑事警察学院_中国大学MOOC(慕课)
大画成像成像镜头光学课程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud:ElasticSearch之DSL查询文档

elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c;一般测试用。例如…

第04章_IDEA的安装与使用(上)

第04章_IDEA的安装与使用&#xff08;上&#xff09; 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 【Why IDEA ?】 【注】JetBrains官方说明&#xff1a; 尽管我们采取了多种…

从二叉树角度看归并排序

归并排序本质上可以看作二叉树的后序遍历 里面用到的核心思想 > 分治 分&#xff1a;二叉树算法思想中的分解问题思想 治&#xff1a;链表中双指针技巧&#xff08;将两条链表合并成一条有序链表&#xff09; sort首先将数组分成左半边和右半边 > 然后分别对左右两…

Log库和配置系统结构

Log库&#xff1a; 类关系 首先有3个大类&#xff1a;LogEvent、LogAppender、Logger、LogFormat&#xff1b; 关系如下&#xff1a; Logger&#xff1a;具体log的实现 LogAppender&#xff1a;将Log信息传输到不同的目的地&#xff0c;根据不同的需求派生出不同的类 LogF…

Java 系列 Nacos

Java 系列文章 文章目录Java 系列文章前言一、Nacas 介绍及安装1. 什么是Nacos2. 为什么使用Nacos3. Nacos 下载和安装二、Nacos服务提供者注册1. Nacos代替Eureka2. Nacos服务注册中心3. Nacos Discovery引入1. 创建新项目2. POM3. YML文件4. 启动类5. 业务类6. 测试&#xff…

Git如何推送当前代码到远程仓库

第一种方法 &#xff08;建立在已经配置好用户变量和ssh基础上&#xff09; 在本地创建git仓库 git init 绑定远程仓库&#xff0c;origin是给远程仓库起的别名&#xff0c;也可以起其他名字&#xff0c;但是如果用origin&#xff0c;git push时可以不指出名字&#xff0c;如果…

【2023 · CANN训练营第一季】昇腾AI入门课(Pytorch)——第一章学习笔记

第一章 昇腾AI基础知识介绍 第2节 昇腾AI全栈架构 昇腾 AI 全栈可以分成四个大部分&#xff1a; 1&#xff0e;应用使能层面&#xff0c;此层面通常包含用于部署模型的软硬件&#xff0c;例如 API 、 SDK 、部署平台&#xff0c;模型库等等。 2. AI 框架层面&#xff0c;此层…

【C语言】 程序员的自我修养之(程序编译过程)

在ANSI C(标准C)的任何一种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境&#xff0c;它用于实际执行代码。 今天我们就讲解他们在这环境过程都做了什么。 文章目录详解编译链接翻译环境编…

【数据库原理 • 七】数据库并发控制

前言 数据库技术是计算机科学技术中发展最快&#xff0c;应用最广的技术之一&#xff0c;它是专门研究如何科学的组织和存储数据&#xff0c;如何高效地获取和处理数据的技术。它已成为各行各业存储数据、管理信息、共享资源和决策支持的最先进&#xff0c;最常用的技术。 当前…

【19】核心易中期刊推荐——人工智能 | 遥感信息处理

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

redis——优化

键值设计bigKey例子批处理单机 pipeline集群服务器持久化慢查询安全内存集群问题集群完整性集群带宽数据倾斜客户端性能命令的集群兼容性lua和事务&#xff1a;集群下不支持键值设计 长度 < 44 节省内存。string的底层数据结构中&#xff0c;编码格式embstr&#xff08;连续…

LeetCode:455. 分发饼干——贪心算法

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 贪心算法是在每个阶段选取局部最优解&#xff0c;最终得到全局最优解的一种思想。贪心算法…

操作系统论文导读(四):Minimizing Memory Utilization of Real-Time Task Sets in Single and…

目录 一、论文核心思想&#xff1a; 二、降低RAM的思想 三、基本的相关定义 四、单处理器方面 五、优化单处理器中的堆栈使用 六、多处理器方面 七、基本的相关调度 八、协议特点 Minimizing Memory Utilization of Real-Time Task Sets in Single and Multi-Processor…

算法记录 | Day29 回溯算法

491.递增子序列 思路&#xff1a; 1.确定回溯函数参数&#xff1a;定义全局遍历存放res集合和单个path&#xff0c;还需要 nums数组startindex&#xff08;int&#xff09;为下一层for循环搜索的起始位置。 2.终止条件&#xff1a;当startindex >len(nums)&#xff0c;r…

C++初阶—vector深度剖析及模拟实现

目录 ➡️0. 前言 &#x1f60a;1.简易框架实现 &#x1f414;1. 无参构造 &#x1f414;2. 容量capacity — 长度size() &#x1f414;3. 动态增长 — push_back—pop_back — reserve &#x1f414;4. 迭代器的实现 &#x1f414;4.front和back的实现 &#x1f60a;2…

你知道C语言的typedef关键字吗?

本篇博客主要讲解C语言中的typedef关键字。typedef的作用是类型重定义&#xff0c;可以理解为给类型起一个别名。我主要从3个方面来讲解&#xff1a; typedef内置类型。typedef自定义类型。typedef和#define的区别。 1.typedef内置类型 typedef可以给一个类型起“别名”。比如…

服务器部署前后端分离项目

服务器部署前后端分离项目 目录服务器部署前后端分离项目一、安装环境安装jdk1、在/usr/local目录下创建jdk文件夹&#xff0c;并将jdk安装包放到/usr/local/jdk包下并解压1.1通过文件传输工具将jdk包上传到服务器上1.2输入解压命令1.3解压完成&#xff0c;生成下面的文件2、配…

学习周报4/9

文章目录前言文献阅读摘要简介方法结论时间序列预测总结前言 本周阅读文献《Improving LSTM hydrological modeling with spatiotemporal deep learning and multi-task learning: A case study of three mountainous areas on the Tibetan Plateau》&#xff0c;文章主要基于…

多种方法解决SLF4J: Defaulting to no-operation (NOP) logger implementation的错误

文章目录1. 复现错误2. 分析错误3. 解决错误4. 解决该错误的其他方法1. 复现错误 今天在编写使用Quartz执行定时任务的方法&#xff0c;如下代码所示&#xff1a; public class QuartzTest {public static void main(String[] args) throws SchedulerException {// 1、创建Sch…

大数据系列——Hive理论

概述 Hive是一个数据仓库管理工具&#xff0c;将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL&#xff08;HQL&#xff09;查询功能。由Facebook实现并开源,最后捐赠给Apache发展为顶级项目。 以RDBMS数据库为元数据存储服务&#xff0c; 以Hadoop HDFS来存储…