对整个图像进行透视变换

  • 透视变换
  • 解决方案

常见的教程都是对所选的四个点内部的区域进行透视变换,但是其他区域都被裁剪掉了。如何利用所选的局部区域对整个图像进行透视变换?

透视变换

透视变换的算法:OpenCV文档

dst(x,y)=src(M11x+M12y+M13M31x+M32y+M33,M21x+M22y+M23M31x+M32y+M33)\texttt{dst} (x,y) = \texttt{src} \left ( \frac{M_{11} x + M_{12} y + M_{13}}{M_{31} x + M_{32} y + M_{33}} , \frac{M_{21} x + M_{22} y + M_{23}}{M_{31} x + M_{32} y + M_{33}} \right ) dst(x,y)=src(M31​x+M32​y+M33​M11​x+M12​y+M13​​,M31​x+M32​y+M33​M21​x+M22​y+M23​​)
推导过程:
通过getPerspectiveTransform()函数得到一个线性变换的矩阵MMM,随后的透视变换过程如下
[x′y′z′]=[M11M12M13M21M22M23M31M321][xy1]\begin{bmatrix} x' \\ y' \\ z' \end{bmatrix} = \begin{bmatrix} M_{11} & M_{12} & M_{13} \\ M_{21} & M_{22} & M_{23} \\ M_{31} & M_{32} & 1 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} ⎣⎡​x′y′z′​⎦⎤​=⎣⎡​M11​M21​M31​​M12​M22​M32​​M13​M23​1​⎦⎤​⎣⎡​xy1​⎦⎤​
由于原始图像中没有zzz轴上的维度,所以设置为1,但经过变换后的图像上的z′z'z′不为1,所以将其归一化,得到
[x′′y′′1]=1z′[x′y′z′]\begin{bmatrix} x'' \\ y'' \\ 1 \end{bmatrix} = \frac{1}{z'} \begin{bmatrix} x' \\ y' \\ z' \end{bmatrix} ⎣⎡​x′′y′′1​⎦⎤​=z′1​⎣⎡​x′y′z′​⎦⎤​
也就得到了OpenCV的公式

解决方案

解决方案参考:Stack Overflow的方案
被裁剪的原因是因为经过变换的坐标变换到了画布范围之外,因此需要确定新画布的大小,并将变换后的图像平移到画布内。
透视变换的矩阵记作M,格式如下:
[M11M12M13M21M22M23M31M321]\begin{bmatrix} M_{11} & M_{12} & M_{13} \\ M_{21} & M_{22} & M_{23} \\ M_{31} & M_{32} & 1 \\ \end{bmatrix} ⎣⎡​M11​M21​M31​​M12​M22​M32​​M13​M23​1​⎦⎤​
设原始图片的四角分别为

(0,0) ________ (0, w)|        ||________|
(h,0)          (h,w)

只要对四角进行变换,就可以确定新画布的边界。
首先坐标点写作矩阵的形式,三行分别代表x,y,zx,y,zx,y,z轴坐标
P=[0ww000hh1111]P = \begin{bmatrix} 0 & w & w & 0 \\ 0 & 0 & h & h \\ 1 & 1 & 1 & 1 \end{bmatrix} P=⎣⎡​001​w01​wh1​0h1​⎦⎤​
类似地,P′=MPP'=MPP′=MP,并将P′P'P′的各列除以各列的最后一行的那个元素进行归一化,得到P′′P''P′′
P′′=[p11p12p13p14p21p22p23p241111]P'' = \begin{bmatrix} p_{11} & p_{12} & p_{13} & p_{14} \\ p_{21} & p_{22} & p_{23} & p_{24} \\ 1 & 1 & 1 & 1 \end{bmatrix} P′′=⎣⎡​p11​p21​1​p12​p22​1​p13​p23​1​p14​p24​1​⎦⎤​
获取xxx上的(第一行)最大最小值xmin,xmaxx_{min}, x_{max}xmin​,xmax​
获取yyy上的(第一行)最大最小值ymin,ymaxy_{min}, y_{max}ymin​,ymax​
Δx=xmax−xmin,Δy=ymax−ymin\Delta x= x_{max}-x_{min},\Delta y= y_{max}-y_{min}Δx=xmax​−xmin​,Δy=ymax​−ymin​即为新画布的宽和高。


以上都是基于Stack Overflow上的回答所写,但正如其中的评论所述,第四步存在错误,但评论也表述不太清楚,在此详细分析一下

为了进一步将变换后的图像平移到画布内,已知了透视变换是通过MMM乘以坐标进行的,可以对MMM进行更改来加入平移操作。
创建单位矩阵,并在第三列放入矩阵P′′P''P′′对应行的最小值的负值,称为矩阵TTT:
T=[10−xmin01−ymin001]T= \begin{bmatrix} 1 & 0 & -x_{min}\\ 0 & 1 & -y_{min} \\ 0 & 0 & 1 \end{bmatrix} T=⎣⎡​100​010​−xmin​−ymin​1​⎦⎤​
则新的变换矩阵M′=TMM'=TMM′=TM。可以简单验证一下,将M′M'M′与坐标相乘并展开,可以发现刚好得到
[x′′′y′′′1]=[x′′−xminy′′−ymin1]\begin{bmatrix} x''' \\ y''' \\ 1 \end{bmatrix}= \begin{bmatrix} x''-x_{min} \\ y''-y_{min} \\ 1 \end{bmatrix} ⎣⎡​x′′′y′′′1​⎦⎤​=⎣⎡​x′′−xmin​y′′−ymin​1​⎦⎤​
因此最后的透视变换的参数为:
warpPerspective(src=src, M=M', dsize=(delta_x, delta_y))

对整个图像进行透视变换相关推荐

  1. OpenCV 分割斜体文字(包括旋转,垂直投影,水平投影,透视变换等)

    一,原图 二,分割成行 三,通过旋转,切割后的效果(无透视变换) 四,通过旋转,透视变换,切割后的效果 五,源代码, //初始化透视变换全局变量 Mat warpMatrix;//计算透视变换矩阵 v ...

  2. 基于c语言矩阵数组透视变换,一种图像透视变换方法与流程

    本发明属于图像处理的技术领域,尤其涉及一种图像透视变换方法. 背景技术: 透视变换是一种常见图像处理方法.透视变换常用于图象的校正,例如在移动机器人视觉导航研究中,由于摄像机与地面之间有一倾斜角,而不 ...

  3. OCR文本扫描 轮廓检测 透视变换

    OCR文本扫描项目实战(图像预处理,调用pytesseract.image_to_string()完成文本识别) 本项目和源代码来自唐宇迪opencv项目实战 本文是一篇OCR文本扫描项目实战的学习笔 ...

  4. 文档扫描仪的构建——使用Python,OpenCV应用透视变换来获得图像的自顶向下的“鸟瞰图”

    使用Python,OpenCV应用透视变换来获得图像的自顶向下的"鸟瞰图" 1. 效果图 2. 应用透视变换的步骤 3. 优化:矩形角点的获取 4. 源码 参考 这篇博客演示了如何 ...

  5. 基于自适应逆透视变换的车道线SLAM

    公众号致力于分享点云处理,SLAM,三维视觉,高精地图相关的文章与技术,欢迎各位加入我们,一起每交流一起进步,有兴趣的可联系微信:920177957.本文来自点云PCL博主的分享,未经作者允许请勿转载 ...

  6. OpenCV中的透视变换介绍

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 透视变换原理 透视变换是将图像从一个视 ...

  7. 【OpenCV 4开发详解】图像透视变换

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  8. 【图像处理】透视变换 Perspective Transformation

    透视变换(Perspective Transformation)是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping).通用的变换公式为: ...

  9. Duanxx的图像处理学习: 透视变换(一)

    当人用眼睛看事物的时候,会感觉到近处的东西是比远处的东西要大一些的,通俗的说,这就是透视. 总的来说.透视变换是将3D的世界转换到2D图像上的一种手段,人的视觉系统和摄像头视觉系统也是基于这一工作原理 ...

最新文章

  1. python输入字母判断大小写_Python-检查输入的数字、大写字母、小写字母和特殊字符...
  2. windows下安装redis以及一些常规操作
  3. vc60如何输入c语言,vc60中如何编译运行及调试c语言程序.pdf
  4. POJ-3281 Dining 网络流最大流
  5. QT练习9 Dialog学习
  6. 你要知道的开源地理空间软件10件事
  7. 产品经理经验谈:与产品经理有关的100件小事儿~
  8. day35-mysql之表的详细操作
  9. 基于Docker快速搭建ELK
  10. vue2.x-cnode(vue全家桶)
  11. Python List sort方法无效
  12. 蓝牙小钢炮 - Bose 博士 Revolve 蓝牙音箱使用感受
  13. 计算机专业实习心得,计算机毕业实习心得体会范本5篇
  14. Django setting ALLOWED_HOSTS
  15. Zookeeper分布式锁解决羊群效应的方案
  16. bgp状态idle什么原因_BGP - 2,BGP报文和BGP状态(转)
  17. Redis 帝国的神秘使者,竟然想改造 C 语言!
  18. C# textbox快捷键添加横杠
  19. H3C交换机常用命令(初学)
  20. Sa函数 与 sinc函数

热门文章

  1. Redis学习之mget命令
  2. 软件测试人员会被替代吗?IT行业哪个方向的前景最好?字节12年测开是这样说的
  3. python爬取豆瓣排名前250部电影封面
  4. PyTorch实战1——预测未来某地区租赁单车的使用情况
  5. Ocrking图片识别之Java实现本地验证码的识别
  6. 方法(Methods)
  7. HDOJ/HDU 1133 Buy the Ticket(数论~卡特兰数~大数~)
  8. org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be re
  9. 2022.1.20国产蓝牙AOA高精度定位厂家开放华东上海和华北北京的FAE岗位招聘欢迎行业内部推荐
  10. 微信公众号---报名系统