目录

  • 前言
  • 镜头成像畸变原因
  • 去畸变方法
  • python去畸变
    • 输入
    • 代码
    • 结果

前言

由于相机的镜头并不完全理想,成像时会产生线条扭曲、失真等。对双目图像、鸟瞰图等进行处理时,首先要矫正去畸变。

镜头成像畸变原因

相机的镜头前有一块透镜,由于透镜的形状,当光线穿过透镜时,靠近光轴的光线折射比远离光轴的折射要小,就会产生径向畸变,此时真实世界中的直线在图像中会被弯曲,往外弯曲是枕形畸变,如下图(b),往里弯曲是桶形畸变,如下图(c)
由于透镜不可能完全与相机里的成像面平行,就会造成切向畸变

去畸变方法

假设归一化平面上的点P(x, y),可用极坐标(r, θ)表示,r就是P与归一化平面原点之间的距离,径向畸变就可以视为坐标点沿着距离方向发生改变,可以用畸变参数k1,k2,k3来修正;切向畸变可以看作坐标点的水平夹角发生改变。用多项式进行畸变拟合:
x d i s t o r t = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) ) y d i s t o r t = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y ) \\x_{distort} =x(1+k_1r^2+k_2r^4+k_3r^6+2p_1xy+p_2(r^2+2x^2))\\ \\y_{distort}=y(1+k_1r^2+k_2r^4+k_3r^6+p_1(r^2+2y^2)+2p_2xy)\\ xdistort​=x(1+k1​r2+k2​r4+k3​r6+2p1​xy+p2​(r2+2x2))ydistort​=y(1+k1​r2+k2​r4+k3​r6+p1​(r2+2y2)+2p2​xy)
将这些畸变后的点在像素平面上的坐标计算出来:
u = f x x d i s t o r t + c x v = f y y d i s t o r t + c y u=f_xx_{distort}+c_x\\ v=f_yy_{distort}+c_y\\ u=fx​xdistort​+cx​v=fy​ydistort​+cy​
然后把畸变后的像素放回原本的位置,即去除了畸变。

python去畸变

输入

一张工厂灰度图,由于畸变导致部分直线条明显被弯曲了

代码

采用cv2.undistort(path, P, K)函数去畸变
其中img表示输入图,P是3x3 numpy数组表示相机内参,K是1x1 numpy数组表示畸变参数[k1, k2, p1, p2, k3=None, k4=None, k5=None, k6=None]

import cv2
import numpy as npimg = cv2.imread('distorted.png')
P = [[458.654, 0, 367.215],[0, 457.296, 248.375],[0, 0, 1]]
K = [-0.28340811, 0.07395907, 0.00019359, 1.76187114e-05]
img_distort = cv2.undistort(img, np.array(P), np.array(K))
img_diff = cv2.absdiff(img, img_distort)
cv2.imshow('img', img)
cv2.imshow('img_distort', img_distort)
cv2.imshow('img_absdiff', img_diff)
cv2.imwrite('distorted_res.png', img_distort)
cv2.waitKey(0)

结果

矫正后的图像如下,可见弯曲的线都恢复正常了,但原图部分像素没有还原(落在了矫正后图像的外面)

python opencv实践 图像去畸变相关推荐

  1. 使用OpenCV给图像去畸变

    相机畸变模型 我们计算畸变都是在归一化平面上进行的,下面的(x,y), (x_distort,y_distort)都是在归一化坐标,相机坐标(X,Y,Z)的归一化坐标(X/Z, Y/Z, 1) 1.径 ...

  2. OpenCV 【十一】—— 图像去畸变,对极约束之undistort,initUndistortRectifyMap,undistort

    目录 0.极限约束,对极校正 1.摄像机成像原理简述 2.成像畸变 2.1. 畸变数学模型 2.2. 公式推导 3.畸变校正 3.1. 理论推导 4. 图像去畸变** 5. 图像尺度缩放与内参的关系* ...

  3. Python基于OpenCV的图像去雾算法[完整源码&部署教程]

    1.图片识别 2.视频展示 [项目分享]Python基于OpenCV的图像去雾算法[完整源码&部署教程]_哔哩哔哩_bilibili 3.算法原理 图像增强算法常见于对图像的亮度.对比度.饱和 ...

  4. 计算机视觉:Opencv图像去畸变

    计算机视觉:Opencv图像去畸变 针孔相机模型图像去畸变 方法一 方法二 区别与联系 鱼眼相机模型图像去畸变 方法一 方法二 区别与联系 参考文献 针孔相机模型图像去畸变 针对畸变参数,k1,k2, ...

  5. opencv图像去畸变

    图像去畸变的思路 对于目标图像(无畸变图像)上的每个像素点,转换到normalize平面,再进行畸变变换,进行投影,得到这个像素点畸变后的位置,然后将这个位置的源图像(畸变图像)的像素值作为目标图像该 ...

  6. Python OpenCV实践,相机标定

    Python OpenCV实践,相机标定 前言 准备棋盘格 标定相机 图像去畸变 前言 本篇主要是使用python opencv标定相机内参和畸变参数的记录,主要参考opencv官方文档中的示例. 本 ...

  7. 图像去畸变矫正及双线性内插法

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 通过采集的图像我们可以得到畸变后的图像,要得到没有畸变的图像要通过畸变模型推导其映射关系. 真实图像 ...

  8. 超实用!图像去畸变矫正及双线性内插法

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 通过采集的图像我们可以得到畸变后的图像,要得到没有畸变的图像要通过畸变模型推导其映射关系. 真实图像 ...

  9. 图像去畸变和添加畸变

    背景:最近的项目中用到的图像去畸变的知识,刚开始是直接调用opencv中提供的函数cv::initUndistortRectifyMap()和cv::remap()函数,实现图像的全局去畸变,但是由于 ...

最新文章

  1. “史上最全PyTorch资源汇总“(转载)
  2. 通俗易懂,java8 .stream().map().collect()用法
  3. Spring Reactor教程
  4. 编程范式之rotate操作
  5. vue router name命名规范_vue-router使用
  6. mysql 配置root密码_Mysql安装与配置调优及修改root密码的方法
  7. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_15-页面静态化-模板管理-模板管理业务流程...
  8. 如何设计企业特色的数字化转型架构?
  9. win10联想Y7000重启蓝牙消失报显卡错误代码43
  10. 如何画出一张优秀的架构图(老鸟必备)
  11. 数字三角形(C语言)
  12. 流浪日记无限金币html,流浪日记无敌版金钱版
  13. centos cpu排查_Linux/CENTOS 系统 CPU 占用率较高负载较高问题排查思路 - 沃森博客...
  14. 海康威视工程师谈嵌入式软件
  15. excel的数据通过pyecharts生成图表,插入ppt
  16. C#如何实现窗体背景颜色渐变?
  17. 数据指标显示,目前还没到牛市顶点 2021-04-24
  18. 《2022抖音非遗报告》发布,前沿影像技术8K超高清赋能“非遗+旅游”业态
  19. 配置XP 远程桌面连接
  20. 2018-2019-2 20165212《网络对抗技术》Exp9 Web安全基础

热门文章

  1. a++ 与 ++a 的区别
  2. 如何找到在东湾三谷一个好的汽车车身修理店
  3. python操作execl常用方法总结
  4. Shadows 阴影 光照系列8
  5. 初级数据分析师要具备什么技能?
  6. VM虚拟机黑屏解决方法
  7. 搜狐邮箱退信said: 553 5.7.1 Sender ERROR的解决方法
  8. Android gradle implementation与api的区别及引用传递
  9. Linux 容器 (LXC) 介绍
  10. 做linux内核开发累吗,如果你打算看完Linux内核源码,可能穷尽一生都做不出一个系统...