opencv 仿射变换与透视变换详解
常见的2D图像变换从原理上讲主要包括基于2×3矩阵的仿射变换和基于3×3矩阵透视变换。
仿射变换
原理
基本的图像变换就是二维坐标的变换:从一种二维坐标(x,y)到另一种二维坐标(u,v)的线性变换:
如果写成矩阵的形式,就是:
作如下定义:
矩阵T(2×3)就称为仿射变换的变换矩阵,R为线性变换矩阵,t为平移矩阵,简单来说,仿射变换就是线性变换+平移。变换后直线依然是直线,平行线依然是平行线,直线间的相对位置关系不变,因此非共线的三个对应点便可确定唯一的一个仿射变换,线性变换4个自由度+平移2个自由度→仿射变换自由度为6。
opencv中实现仿射变换
import cv2 as cv
import numpy as np
import matplotlib.pyplot as pltimg = cv.imread('drawing.jpg')
rows, cols = img.shape[:2]# 变换前的三个点
pts1 = np.float32([[50, 65], [150, 65], [210, 210]])
# 变换后的三个点
pts2 = np.float32([[50, 100], [150, 65], [100, 250]])# 生成变换矩阵
M = cv.getAffineTransform(pts1, pts2)
# 第三个参数为dst的大小
dst = cv.warpAffine(img, M, (cols, rows))plt.subplot(121), plt.imshow(img), plt.title('input')
plt.subplot(122), plt.imshow(dst), plt.title('output')
plt.show()
实验结果
应用opencv中现成的图像平移、旋转、缩放、翻转
请参考 opencv实现图像几何变换
平移
平移就是x和y方向上的直接移动,可以上下/左右移动,自由度为2,变换矩阵可以表示为:
旋转
旋转是坐标轴方向饶原点旋转一定的角度θ,自由度为1,不包含平移,如顺时针旋转可以表示为:
翻转
翻转是x或y某个方向或全部方向上取反,自由度为2,比如这里以垂直翻转为例:
刚体变换
旋转+平移也称刚体变换(Rigid Transform),就是说如果图像变换前后两点间的距离仍然保持不变,那么这种变化就称为刚体变换。刚体变换包括了平移、旋转和翻转,自由度为3。由于只是旋转和平移,刚体变换保持了直线间的长度不变,所以也称欧式变换(变化前后保持欧氏距离)。变换矩阵可以表示为:
缩放
缩放是x和y方向的尺度(倍数)变换,在有些资料上非等比例的缩放也称为拉伸/挤压,等比例缩放自由度为1,非等比例缩放自由度为2,矩阵可以表示为:
相似变换
相似变换又称缩放旋转,相似变换包含了旋转、等比例缩放和平移等变换,自由度为4。在OpenCV中,旋转就是用相似变换实现的:
若缩放比例为scale,旋转角度为θ,旋转中心是(centerx,centery),则仿射变换可以表示为:
其中:
相似变换相比刚体变换加了缩放,所以并不会保持欧氏距离不变,但直线间的夹角依然不变。
透视变换
前面仿射变换后依然是平行四边形,并不能做到任意的变换。
原理
透视变换(Perspective Transformation)是将二维的图片投影到一个三维视平面上,然后再转换到二维坐标下,所以也称为投影映射(Projective Mapping)。简单来说就是二维→三维→二维的一个过程。
透视变换公式:
透视变换矩阵表示:
仿射变换是透视变换的子集。接下来再通过除以Z轴转换成二维坐标:
透视变换相比仿射变换更加灵活,变换后会产生一个新的四边形,但不一定是平行四边形,所以需要非共线的四个点才能唯一确定,原图中的直线变换后依然是直线。因为四边形包括了所有的平行四边形,所以透视变换包括了所有的仿射变换。
opencv中实现透视变换
OpenCV中首先根据变换前后的四个点用cv.getPerspectiveTransform()生成3×3的变换矩阵,然后再用cv.warpPerspective()进行透视变换。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread('card.jpg')# 原图中卡片的四个角点
pts1 = np.float32([[148, 80], [437, 114], [94, 247], [423, 288]])
# 变换后分别在左上、右上、左下、右下四个点
pts2 = np.float32([[0, 0], [320, 0], [0, 178], [320, 178]])# 生成透视变换矩阵
M = cv.getPerspectiveTransform(pts1, pts2)
# 进行透视变换,参数3是目标图像大小
dst = cv.warpPerspective(img, M, (320, 178))plt.subplot(121), plt.imshow(img[:, :, ::-1]), plt.title('input')
plt.subplot(122), plt.imshow(dst[:, :, ::-1]), plt.title('output')
plt.show()
实验结果
总结
图解图像各种变换
opencv 仿射变换与透视变换详解相关推荐
- 基于OpenCV的图像透视变换详解(从理论到实现再到实践)
一.仿射变换与透视变换 一直无法理解两种仿射变换与透视变换的区别,因此详细学习了两种变换的具体细节,重新书写了公式,并给出自己的一些看法. 1.仿射变换 可以认为,仿射变换是透视变换的一种特例. ...
- 逆透视变换详解 及 代码实现(二)
根据 逆透视变换详解 及 代码实现(一)的原理 下面我用车上拍摄的车道图像,采用逆透视变换得到的图像,给出代码前我们先看下处理结果. 首先是原始图像: 下图为逆透视变换图像: 下面说具体的实现吧!! ...
- 逆透视变换详解 及 代码实现(一)
逆透视变换详解 及 代码实现(一) 中主要是原理的说明: 一.世界坐标轴和摄像机坐标轴 从下图中可以看到,世界坐标为(X,Y,Z) 相机坐标为(Xc,Yc,Zc) 而世界坐标变换到相机坐标存在一个旋 ...
- 逆透视变换详解 及 代码实现
逆透视变换详解 及 代码实现(一) 中主要是原理的说明: 一.世界坐标轴和摄像机坐标轴 从下图中可以看到,世界坐标为(X,Y,Z) 相机坐标为(Xc,Yc,Zc) 而世界坐标变换到相机坐标存在一个旋 ...
- c++ opencv函数putText用法详解
c++ opencv函数putText用法详解 #include <stdio.h> #include <iostream> #include <opencv2/open ...
- OpenCV SIFT源码详解——总体概览
OpenCV SIFT源码详解--总体概览 一.版本 二.章节系列 此系列文章源自本人硕士毕业论文,主要讲源码,对于SIFT理论知识默认大家有过了解.若文章中有不对之处还请读者指出. 一.版本 本系列 ...
- opencv的逻辑运算bitwise详解
官网介绍 http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html# 代码 #include <windows. ...
- 【OpenCV实战】OpenCV实现人脸检测详解(含代码)
OpenCV中有许多可以进行人脸.人眼检测的特征文件,今天我们利用OpenCV中自带的特征文件haarcascade_frontalface_default.xml来进行人脸检测. [OpenCV实战 ...
- OpenCV 4.x API 详解与C++实例-OpenCV基本数据类型
第一节 OpenCV基本数据类型 1.OpenCV数据类型组成 OpenCV数所类型主要由三种类型组成: 1)基本数据类型,继承C++基本数据类型,如int.float.数组.矩阵等. 2)辅助对象, ...
最新文章
- 高德地图和百度地图接口封装遇到的问题(二):绘制带有方向箭头的折线
- UWA DAY 2018 精彩议题全曝光!
- Python天天美味(22) - 拷贝对象(深拷贝deepcopy与浅拷贝copy)
- mysql数据实时同步:Canal安装部署、kafka安装、zk安装、mysql安装、Canal Server+Canal Client HA,Canal+mysql+Kafka,相关验证(学习笔记)
- Kendo UI Validator 概述
- linux网络编程:使用多进程实现socket同时收发数据
- php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式
- netbeans java中文_Ubuntu 下jdk安装中文字体 java 解决netbeans 方块字 中文乱码
- mysql 删除 like_MySQL 定时删除数据
- 基于JAVA+SpringMVC+Mybatis+MYSQL的航班预订系统
- c语言上机题库及答案,全国计算机二级C语言上机题库及答案
- windows动态ip和静态ip的bat文件
- 5G牌照都发完了,那些传说中的5G手机Ready了吗?
- Java迷宫小游戏,老程序员花一天时间完成,你可以吗?
- HTML控件事件一览表
- 重读《触龙说赵太后》
- html之ins标签
- mysql Access denied; you need (at least one of) the SUPER privilege(s) for this operation
- 计算机市场调研报告doc,计算机市场调研报告.doc
- [转]通货膨胀是什么意思
热门文章
- 为什么都建议学java而不是python-现在学Python还是Java好呢?
- python视频教程-中谷python中文视频教程(全38集)
- python中国官网-中蟒 (中文 Python) 編程語言網站 chinesepython
- 收文处理和发文处理的环节_液相色谱使用中样品预处理需要注意的几个环节汇总!...
- webpack跨域问题记录
- lync显示无法找到服务器,Lync 2013 已知问题
- 图像全参考客观评价算法比较
- ffmpeg 源代码简单分析 : avcodec_register_all()
- mysql oltp_oltp数据库mysql
- 信息服务器的设置,设置服务器SSH信息