图像畸变与去畸变

2023-05-16

本文主要介绍图像畸变产生的原因,广角镜头的一般畸变模型和去畸变的方法。

1.图像畸变

图像畸变是由于透镜制造精度以及组装工艺的偏差会引入畸变,导致原始图像失真。镜头的畸变分为径向畸变和切向畸变两类。

1.1 径向畸变与畸变模型

径向畸变是由于镜头自身凸透镜的固有特性造成的,产生原因是光线在远离透镜中心的地方比靠近中心的地方更加弯曲。

畸变沿着透镜半径方向分布,主要包括桶形畸变和枕形畸变两种,如下图所示:

                    正常物体                                                       枕形畸变                                                        桶形畸变

畸变的数学模型可以用主点(principle point)周围的泰勒级数展开式的前几项进行描述,通常使用前两项,即k1和k2,对于畸变很大的镜头,可以增加使用第三项k3来进行描述:

   

其中,(x,y)是非畸变的坐标位置,(x0,y0)是畸变后的坐标位置。成像仪光轴中心的畸变为0,沿着镜头半径方向向边缘移动,畸变越来越严重。

1.2 切向畸变与畸变模型

切向畸变是由于透镜本身与相机传感器平面(成像平面)或图像平面不平行而产生的,这种情况多是由于透镜被粘贴到镜头模组上的安装偏差导致。

畸变模型可以用两个参数p1和p2来描述:

  

其中,(x,y)是非畸变的坐标位置,(x0,y0)是畸变后的坐标位置。

注意:

1)所有的畸变计算均在摄像机坐标系下进行。

2)每个镜头的畸变系数[k1,k2,k3,p1,p2],可以通过标定得出。

 

2.图像去畸变

从镜头获取的原始图像,都是存在第一部分所述的两种畸变的,为了后续进行更好的图像操作,我们需要首先执行去畸变过程:

1)首先将像素坐标(u,v)转到摄像机坐标系下(通过camera内参):

x=(u-cx)/fx;

y=(v-cy)/fy;

z=1;//单位平面

2)计算畸变量:

3)畸变位置:

4)将该摄像机坐标系下的坐标转到像素坐标系下:

for (int v = 0; v < grayimg.rows; v++)
{
     for (int u = 0; u < grayimg.cols; u++)
     {

         image_de_distort.at<unsigned char>(v, u) = imgsrc.at<unsigned char>(v′, u′);

     }

}

imgsrc是直接获取的有畸变的图像, image_de_distort是去畸变后的图像。

        

                                    原始图像(存在畸变)                                                                                    去畸变后的图像

 

第二部分:

摄像头模组的畸变是无法避免的,那为了保证相机的成像质量,必然涉及到图像的畸变处理,这里试图说明Brown畸变模型下的去畸变和加畸变的原理和过程,多项式畸变的处理方式类似。

1. 像素位置加畸变和去畸变

畸变前的像素位置和畸变后的像素位置关系式:

从未畸变的像素位置变换到畸变的位置这一正向过程比较简单,直接套用公式就可以得到。从畸变的像素位置得到去畸变后的像素位置是比较复杂的,这是一个逆向的过程,由于函数关系是单调的,一般采用迭代法,这样方便编程实现和计算机的计算

2. 线性插值和双线性插值

插值法常用于计算周围点的之间点的值,插值法分为线性插值、双线性插值、三次样条插值等,这里介绍线性插值和双线性插值的原理,双线性插值在图像像素的插值中被频繁采用。线性插值如公式:

从公式中可以看出该线性插值的含义:以距离为权重,加权y1、y2得到的值。

双线性插值法:双线性插值是线性插值的扩展,像素值双线性插值的示意如图所示。

X方向的插值为: 

Y方向的插值为:

最后得到双线性的插值结果:

 

双线性插值在图像的过滤、变换、形态学处理、去畸变、加畸变用得很多。

3. 图像去畸变和加畸变的过程

图像去畸变是指依据畸变参数,将图像恢复到畸变前。图像去畸变的过程示意如图所示。

    

图左中rectified image是去畸变后的图像REC,distorted image为畸变后的图像DIS。去畸变流程如下:

  1. 按顺序对REC中的像素位置加畸变处理,得到畸变后的浮点像素位置映射图
  2. 基于映射图,找到REC像素位置在DIS中的对应位置P,对P的4个邻位置的像素值进行双线性插值得到P点的像素值。
  3. 这样REC的每个位置都从DIS中找到了对应的像素值,从而得到去畸变后的图像。

图像加畸变的过程和图像去畸变的过程相反,如图右所示,加畸变的像素位置进行去畸变处理,找到在未畸变图像中的对应位置,双线性插值计算其像素值,从而得到加畸变的图像。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像畸变与去畸变 的相关文章

  • linux makefile的一些变量

  • Nuttx学习笔记(二)————在STM32上部署Nuttx系统

    目录 一 平台配置 二 在ubuntu下使用串口来烧录至目标文件至STM32F07 xff08 一 xff09 ubuntu下stm32flash工具下载 xff08 二 xff09 Ubuntu20 04安装stm32开发环境 xff08
  • linux种Makefile一些自动化变量

  • arm 中的三级流水线中的PC值和当前指令的关系

  • TIM输出比较的三种模式

    TIM输出比较的三种模式 此项功能是用来控制一个输出波形 xff0c 或者指示一段给定的的时间已经到时 当计数器与捕获 比较寄存器的内容相同时 xff0c 输出比较功能做如下操作 xff1a 将输出比较模式 TIMx CCMRx寄存器中的O
  • TIM_OCMode_PWM2;TIM_OCMode_PWM1

    首先 xff0c 本人虽然初学STM32但极力反对一种误人子弟的观点 xff1a 对于STM32这样级别的MCU xff0c 有库函数就不用去看寄存器怎么操作的了 xff01 好了 xff0c 言归正传 xff0c 最近总看到很多朋友对于P
  • MOS器件的重要特性——15个为什么?

    MOS器件的重要特性 15个为什么 xff1f xff08 一 xff09 xff08 1 xff09 为什么E MOSFET的阈值电压随着半导体衬底掺杂浓度的提高而增大 xff1f 而随着温度的升高而下降 xff1f 答 E MOSFET
  • 采样频率、采样点数、频率分辨率

    1 频率分辨率的2种解释 解释一 xff1a 频率分辨率可以理解为在使用DFT时 xff0c 在频率轴上的所能得到的最小频率间隔f0 61 fs N 61 1 NTs 61 1 T 其中N为采样点数 xff0c fs为采样频率 xff0c
  • 32位单片机 一个32位地址代表一个字节而不是4个字节(32位)

    在数据手册上 xff0c BSRR的偏移地址为0X18 xff0c 然后手册讲完BSRR后直接讲LCKR了 xff0c 并且LCKR的偏移地址是 OX1C 所以根据 OX1C 0X18 61 0X04 就知道BSRR是32位寄存器了 因为一
  • μC/OS-Ⅲ系统的任务切换和任务调度

    C OS 系统的任务切换和任务调度 一 任务切换 在操作系统中当任务需要从一个任务切换到另外一个任务时 xff0c 要将当前任务的现场保存到当前任务的堆栈中 xff08 当前任务现场主要指CPU相关寄存器 xff09 xff0c 然后回复新
  • 反射系数、驻波比、S参数之间的关系

    反射系数 驻波比 S参数之间的关系 xff01 转载 回波损耗 Return Loss 入射功率 反射功率 为dB数值 反射系数 反射电压 入射电压 为标量 电压驻波比 Voltage Standing Wave Ration 波腹电压 波
  • 浅谈PWM控制电机

    先简单说说这几种模式 1 双极模式 xff0c 即电枢电压极性是正负交替的 xff0c 优点 xff1a 能正反转运行 xff0c 启动快 xff0c 调速精度高 xff0c 动态性能好 xff0c 调速静差小 xff0c 调速范围大 xf
  • Nuttx系统学习笔记(三)——使用Nuttx操作STM32F429外设

    在上一篇 xff0c 我们已经学会了如何将Nuttx进行烧录 xff0c 以及学会了如何部署这个操作系统 xff0c 接下来我们就要使用这个操作系统来实现我们对嵌入式设备的控制 xff0c 当然也是从点灯开始的 这个基于Posix架构的操作
  • .NetCore 5.0 WebAPI 发布到iis时访问api出现404的解决方案

    情况介绍 xff1a 新建了个 NetCore 5 0 的 WebAPI项目 xff0c 发布部署到WINDOWS10 的 IIS后 xff0c 默认打开 http 127 0 0 1 swagger 出现404找不到页面的错误 原因 xf
  • 新手如何快速入门人工智能?

    网上有很多关于 新手如何快速入门人工智能 的文章 xff0c 但是对于真正的小白来说并没有太多的指导作用 作为新手想进入人工智能领域 xff0c 首先是要明确需要掌握哪些基础知识 xff0c 其次是掌握一套行之有效的学习方法 xff0c 最
  • 人工智能入门需要学习哪些课程?AI基础知识

    要入门人工智能 xff0c 需要掌握一些基础知识和技能 以下是一些入门人工智能需要学习的课程和基础知识 xff1a 人工智能入门需要学习哪些课程 xff1f AI基础知识 数学基础 xff1a 人工智能需要用到许多数学知识 xff0c 包括
  • 模块学习2:基于PELCO-D协议对云台进行定点控制

    开发手上的一个云台 xff0c 使用的就是PELCO D协议 这个协议开始网上找了一圈 xff0c 发现下载完整版的协议大多是还都要收费 xff0c 后面在官方下载了一份原版完整版协议的协议内容 xff0c 配合网上搜索到的资料完成对手上这
  • C语言和C++的区别(函数重载)

    C和C 43 43 的区别主要分为三部分 xff1a 接下来详细介绍一下函数部分的区别 1 返回类型 2 参数列表 此外 xff0c 在C 43 43 中还支持缺省参数 xff0c 而C语言不支持 什么是缺省参数呢 xff1f 缺省参数是声
  • 动态创建二维数组的两种方法

    首先来讲解一下什么是二维数组 其实二维数组也可以说是一个一维数组 xff0c 只是这个一维数组比较特别 xff0c 它的每一个元素都是一个一维数组 虽然二维数组在底层是按照一维数组的存储方式来存储的 xff0c 即存完第一行 xff0c 紧
  • 什么是进程?

    程序 xff1a 完成特定任务的一系列指令集合 代码段 43 数据段 放在磁盘中的程序 进程 xff1a 进行就是正在进行中的程序 1 用户角度 xff1a 进程是程序的一次动态执行过程 2 操作系统 xff1a 进程是操作系统分配资源的基

随机推荐

  • 死锁的四个必要条件和解决办法

    死锁概念及产生原理 概念 xff1a 多个并发进程因争夺系统资源而产生相互等待的现象 原理 xff1a 当一组进程中的每个进程都在等待某个事件发生 xff0c 而只有这组进程中的其他进程才能触发该事件 xff0c 这就称这组进程发生了死锁
  • 编译和链接的过程

    程序要运行起来 xff0c 必须要经过四个步骤 xff1a 预处理 编译 汇编和链接 接下来通过几个简单的例子来详细讲解一下这些过程 对于上边用到的几个选项需要说明一下 使用 gcc 命令不跟任何的选项的话 xff0c 会默认执行预处理 编
  • vim常用的功能

    vim是vi 的升级版本 xff0c 它兼容vi的所有指令 xff0c 而且还有一些新的特性 xff0c 比如说预付高亮 可视化操作不仅可以在终端进行 xff0c 还可以在 x Window mac os windows vim 有多种模式
  • vscode electron安装环境

    1 安装nodejs Node js 安装18 12 1LTS版本 安装完成后确认 node version 2 安装electron npm install electron g 验证是否安装成功 electron v 没成功 xff01
  • Debug和Release的区别以及obj文件的作用

    Debug和Release的区别 Debug xff1a 调试版本 xff0c 包含调试信息 xff0c 所以容量比release大很多 xff0c 并且不进行任何优化 xff0c xff08 优化会使调试复杂化 xff0c 因为进行优化肯
  • python中的import、from import以及import as的区别

    首先介绍一下import和include的区别或者说import相对include的好处 xff1a import导入的内容只会被包含一次 xff0c 在引入之前会检测是否已经存在该模块 xff0c 不存在才会被引入 xff0c 而incl
  • error while loading shared libraries: lib*.so: cannot open shared object file: No such file

    linux在编译文件时报错 xff1a slam sample error span class token keyword while span loading shared libraries libslam common so can
  • (1/100) ros的plugin插件和动态参数配置dynamic_reconfigure

    写在前面 xff1a 实际机器人开发中 xff0c 往往会存在很多参数 xff0c 这些参数需要在实际的调试中得出 xff0c 为了更高效的开发与测试 xff0c 则选择使用动态的参数配置 而在机器人功能模块层面 xff0c 我们可能也需要
  • 重定向printf函数到串口输出的多种方法

    本文详细的介绍了如何重定向printf输出到串口输出的多种方法 xff0c 包括调用MDK微库 xff08 MicroLib xff09 的方法 xff0c 调用标准库的方法 xff0c 以及适用于 GNUC 系列编译器的方法 1 prin
  • 如何修复烧写镜像文件失败的SD卡

    前言 使用某些软件 xff08 比如 win32 Disk Imager xff09 向SD卡烧写镜像文件时 xff0c 很有可能出现烧写失败的情况 xff0c 通常如果烧写失败 xff0c 系统会弹出请求格式化SD卡的提示框 此时不要点格
  • FreeRTOS学习笔记(一)基础篇

    我的FreeRTOS学习 xff0c 是从朱工的FreeRTOS系列博客开始的 xff0c 感谢朱工的悉心整理 xff0c 文章很不错 xff0c 适合学习 根据朱工的博客 xff0c 按照我自己的习惯和思路 xff0c 把最关键的信息抓取
  • 程序员要不要懂底层原理

    我在做编程的时候 xff0c 还是一个地道的门外汉 xff0c 就像一个刚出生的孩子 xff0c 跟着大人咿呀呀的学语 xff0c 也不知道是什么 xff0c 做什么用的 xff0c 也不知道能不能换种方式实现 xff0c 总结起来就是一问
  • Z变换零点极点

    在Z变换里 xff0c 零点的位置表示系统的 谷 xff0c 极点的位置表示系统的 峰 xff0c 我们把有峰的地方看做信号可以通过的地方 xff0c 而有谷的地方看做信号被截止的地方 并且我们选择单位圆为频域的一个周期 xff0c 那么可
  • ubuntu16.04下ROS Kinetic详细安装过程

    参考网址 xff1a 点击打开链接 参考文献 xff1a ROS机器人编程 配置环境 xff1a ubuntu 16 04 LTS 43 ROS Kinetic 一 安装ROS 1 设置镜像源 为了保证安装速度 xff0c 需要选择国内的镜
  • vscode环境中配置git

    1 建立project空目录用于存放electron基本环境这个环境中得文件不能加入git项目中否则每次更新文件太大github不支持大于100M得文件上传 2 使用vscode打开project目录 3 打开终端运行npm install
  • idea 主题 代码颜色 代码区背景 行号背景 注释颜色修改

    最近写代码眼睛总是看的不舒服 xff0c 想着换一个主题 xff0c 但是换了主题 xff0c 代码的颜色显示和之前又不一样了 xff0c 接下来就是修改主题 xff0c 但是代码颜色仍然保持 Darcula 主题的颜色 目录 1 修改主题
  • RTT之SysTick做了什么

    经过好几天的摸索 xff0c 终于正常驱动了一个串口设备 xff0c 并成功移植到雅特力的板子上 xff01 当然 xff0c 还得继续努力把RTT的内核搞清楚 xff0c 这样才会构建整个项目程序 xff0c 毕竟项目是有时间限制的 因为
  • realSense 安装 经验整理

    安装 RealSense SDK 以ros 参考1 参考二 主要看参考三 标定 标定 以上内容安装失败 Realense sdk和ros对应关系 jetson jetson 一键安装sdk 官方安装 jetson4 4 xavier nx
  • 吴恩达machine learning yearning读书笔记1

    在 setting up development set and test set 这一章中 xff0c 作者提到了一个很重要的问题 训练集和测试集分布不一致导致的机器学习模型泛化能力有限 xff1a 在训练集上表现比较好 xff0c 但是
  • 图像畸变与去畸变

    本文主要介绍图像畸变产生的原因 xff0c 广角镜头的一般畸变模型和去畸变的方法 1 图像畸变 图像畸变是由于透镜制造精度以及组装工艺的偏差会引入畸变 xff0c 导致原始图像失真 镜头的畸变分为径向畸变和切向畸变两类 1 1 径向畸变与畸