本篇笔记主要记录Opencv里的图像翻转,平移,旋转,仿射及透视功能,主要是下面几个API:

  • cv2.flip() # 图像翻转
  • cv2.warpAffine() #图像仿射
  • cv2.getRotationMatrix2D() #取得旋转角度的Matrix
  • cv2.GetAffineTransform(src, dst, mapMatrix) #取得图像仿射的matrix
  • cv2.getPerspectiveTransform(src, dst) #取得图像透视的4个点起止值
  • cv2.warpPerspective() #图像透视

图像翻转 cv2.flip()

cv2.flip(src, flipCode[, dst]) → dst

  • src: 原始图像矩阵;
  • dst: 变换后的矩阵;
  • flipMode: 翻转模式,有三种模式
    • 0 --- 垂直方向翻转; 1----- 水平方向翻转; -1:水平、垂直方向同时翻转

    flipCode==0垂直翻转(沿X轴翻转),flipCode>0水平翻转(沿Y轴翻转),flipCode<0水平垂直翻转(先沿X轴翻转,再沿Y轴翻转,等价于旋转180°)

%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
import cv2image = cv2.imread("aier.jpg")
# Flipped Horizontally 水平翻转
h_flip = cv2.flip(image, 1)
# Flipped Vertically 垂直翻转
v_flip = cv2.flip(image, 0)
# Flipped Horizontally & Vertically 水平垂直翻转
hv_flip = cv2.flip(image, -1)plt.figure(figsize=(8,8))plt.subplot(221)
plt.imshow(image[:,:,::-1])
plt.title('original')plt.subplot(222)
plt.imshow(h_flip[:,:,::-1])
plt.title('horizontal flip')plt.subplot(223)
plt.imshow(v_flip[:,:,::-1])
plt.title(' vertical flip')plt.subplot(224)
plt.imshow(hv_flip[:,:,::-1])
plt.title('h_v flip')
# 调整子图间距
# plt.subplots_adjust(wspace=0.5, hspace=0.1)
plt.subplots_adjust(top=0.8, bottom=0.08, left=0.10, right=0.95, hspace=0,wspace=0.35)
# plt.tight_layout()
plt.show()

cv2.flip()

图像平移,旋转,仿射  cv2.warpAffine()

cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

src input image.
dst output image that has the size dsize and the same type as src .
M   2×3 transformation matrix.
dsize   size of the output image.
flags   combination of interpolation methods (see InterpolationFlags) and the optional flag WARP_INVERSE_MAP that means that M is the inverse transformation ( dst→src ).
borderMode  pixel extrapolation method (see BorderTypes); when borderMode=BORDER_TRANSPARENT, it means that the pixels in the destination image corresponding to the "outliers" in the source image are not modified by the function.
borderValue value used in case of a constant border; by default, it is 0.

cv2.getRotationMatrix2D(center, angle, scale)

函数有三个参数:

  • center:图片的旋转中心
  • angle:旋转角度
  • scale:缩放比例,该例中0.5表示我们缩小一半
%matplotlib inline
from matplotlib import pyplot as plt
import cv2
import numpy as npimg = cv2.imread('aier.jpg')
rows,cols = img.shape[:2]# 定义平移矩阵,需要是numpy的float32类型
# x轴平移200,y轴平移100, 2*3矩阵
M = np.float32([[1, 0, 200], [0, 1, 100]])
# 用仿射变换实现平移
img_s = cv2.warpAffine(img, M, (cols, rows), borderValue=(155, 150, 200))# 第一个参数旋转中心,第二个参数旋转角度,第三个参数:缩放比例, 生成一2*3的矩阵
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
M1 = cv2.getRotationMatrix2D((cols/2,rows/2),180,1)
M2 = cv2.getRotationMatrix2D((cols/2,rows/2),60,1)
print(M)
'''
[[ 6.123234e-17  1.000000e+00  1.500000e+02][-1.000000e+00  6.123234e-17  6.500000e+02]]
'''
# 第三个参数:变换后的图像大小
img_tra = cv2.warpAffine(img,M,(cols,rows))
img_tra1 = cv2.warpAffine(img,M1,(cols,rows))
img_tra2 = cv2.warpAffine(img,M2,(cols,rows), borderValue=(155, 100, 155))plt.figure(figsize=(8,8))
plt.subplot(221)
plt.imshow(img[:,:,::-1])plt.subplot(222)
plt.imshow(img_s[:,:,::-1])plt.subplot(223)
plt.imshow(img_tra[:,:,::-1])plt.subplot(224)
plt.imshow(img_tra2[:,:,::-1])plt.subplots_adjust(top=0.8, bottom=0.08, left=0.10, right=0.95, hspace=0,wspace=0.35)
plt.show()

平移,旋转

图像仿射

图像的旋转加上拉升就是图像仿射变换,仿射变化也是需要一个M矩阵就可以,但是由于仿射变换比较复杂,一般直接找很难找到这个矩阵,opencv提供了根据变换前后三个点的对应关系来自动求解M。这个函数是
M=cv2.getAffineTransform(pos1,pos2),其中两个位置就是变换前后的对应位置关系。输出的就是仿射矩阵M。然后在使用函数cv2.warpAffine()。

cv.GetAffineTransform(src, dst, mapMatrix) → None

  • Parameters: 变换前的三个点与其对应的变换后的点.

    • src – Coordinates of triangle vertices in the source image.
    • dst – Coordinates of the corresponding triangle vertices in the destination image.

The function calculates the 2*3 matrix of an affine transform.

AffineMatrix = cv2.getAffineTransform(np.array(SrcPointsA),
np.array(CanvasPointsA))

图像仿射示例图

%matplotlib inline
from matplotlib import pyplot as plt
import cv2
import numpy as npimg = cv2.imread('aier.jpg')
rows,cols = img.shape[:2]
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,20],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
#第三个参数:变换后的图像大小
res = cv2.warpAffine(img,M,(rows,cols))
plt.subplot(121)
plt.imshow(img[:,:,::-1])plt.subplot(122)
plt.imshow(res[:,:,::-1])plt.show()

透视 Perspective

视角变换,需要一个3*3变换矩阵。在变换前后要保证直线还是直线。
构建此矩阵需要在输入图像中找寻 4个点,以及在输出图像中对应的位置。这四个点中的任意三个点不能共线。

## pts1 ==> pts2
pts1=np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2=np.float32([[0,0],[300,0],[0,300],[300,300]])
M=cv2.getPerspectiveTransform(pts1,pts2)

cv2.getPerspectiveTransform(np.array(SrcPointsA), np.array(CanvasPointsA))

cv2.getPerspectiveTransform(src, dst) → retval

cv2.warpPerspective(Img, PerspectiveMatrix, (300, 300))

cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst

src – input image.
dst – output image that has the size dsize and the same type as src .
M – 3*3 transformation matrix.
dsize – size of the output image.
flags – combination of interpolation methods (INTER_LINEAR or INTER_NEAREST) and the optional flag WARP_INVERSE_MAP, that sets M as the inverse transformation ( dst ---> src ).
borderMode – pixel extrapolation method (BORDER_CONSTANT or BORDER_REPLICATE).
borderValue – value used in case of a constant border; by default, it equals 0.

4个点前后映射示例图

%matplotlib inline
from matplotlib import pyplot as plt
import cv2
import numpy as npimg=cv2.imread('aier.jpg')
rows,cols,ch=img.shape
pts1=np.float32([[56,5],[368,5],[28,387],[389,390]])
pts2=np.float32([[0,0],[300,0],[0,300],[300,300]])
M=cv2.getPerspectiveTransform(pts1,pts2)
print(M)
dst=cv2.warpPerspective(img,M,(300,300))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

图像透视

本文主要内容就是这些,其他更深入功能待后续继续完善.....
[参考]
Geometric Transformations of Images

作者:深思海数_willschang
链接:https://www.jianshu.com/p/ef67cacf442c
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Opencv-Python学习笔记五相关推荐

  1. Python学习笔记五:控制语句

    Python学习笔记五:控制语句 Pycharm 开发环境的下载安装配置_项目管理 控制语句 Pycharm 开发环境的使用 Pycharm 下载和安装 激活和选择不同UI 风格 创建项目和初始化配置 ...

  2. Python学习笔记(五)—LOOP 循环

    个人认为Python基础学习直到LOOP才算真正开始. 循环有While, do-while, 和for() 比如while 我们要输出100条"you are my sunshine &q ...

  3. 【懒懒的Python学习笔记五】

    在这一章中,你将学习到能够将信息关联起来的Python字典,将学习如何访问和修改字典中的信息,同时也会学习如何遍历字典中的数据. 一.一个简单的字典 新建了一个存储用户信息的字典,里面存储了用户姓名. ...

  4. Python学习笔记五:条件循环

    文章目录 一.再谈print和import 1. 打印多个参数 2. 导入时重命名 二.赋值魔法 1. 序列解包 2. 链式赋值 3. 增强赋值 三.代码块:缩进的乐趣 四.条件和条件语句 1. 这正 ...

  5. Python学习笔记五--条件和循环

    5.1 if语句 没什么好说,if语句语法如下: if expression: expr_true_suit 5.1.1多重条件表达式 单个if语句可以通过布尔操作符and,or,not实现多重条件判 ...

  6. openCV Python学习笔记(二)画几何

    此处要花几何图形,我们需要用到如下几个函数: cv2.line 画线函数 cv2.circle 画圆函数 cv2.ellipse 画椭圆 cv2.rectangle 画矩形 1.画线 img=cv2. ...

  7. OpenCV Python学习笔记(5)—— 边缘保留滤波(EPF)

    1 边缘保留滤波 高斯双边 均值迁移 2 测试 import cv2 as cv import numpy as npdef bi_demo(image):dst = cv.bilateralFilt ...

  8. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

  9. Python学习笔记总结

    了解了python语言后,决定以后使用python来进行各项工作,因此一直想要深入学习python.千里之行始于足下,万事开头难. 由于最近在准备写毕业论文,陆陆续续学习了Python的语法知识. P ...

  10. OpenCV之Python学习笔记(1)(2): 图像的载入、显示和保存 图像元素的访问、通道分离与合并

    OpenCV之Python学习笔记 一直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看到一本国外的新书< ...

最新文章

  1. 银行软件开发实习生_如何找到学生的软件开发人员实习生
  2. java空值转datetime,关于java1.8中LocalDateTime实现日期,字符串互转小坑。
  3. org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' not supported
  4. idea xml文件去掉背景黄色
  5. css3玩转各种效果【资源】
  6. H5-geolocation学习
  7. Android的APP多版本,Android多版本共存-基于gradle实现debug版和release版app共存
  8. mysql主从延迟时间是多少_MySQL主从延迟
  9. android 表情识别,基于Android平台的人脸表情识别系统的设计与实现
  10. 【原创】Mac 工作协同之文件共享问题
  11. mysql各版本下载及免费mysql可视化工具下载(上班记录)
  12. python通信系统仿真_Python与V-REP联合仿真
  13. 你该把前端外包出来了
  14. peoplesoft 调用Java_利用 XML Publisher 创建 PeopleSoft 报表
  15. GitHub基本操作
  16. vue项目中引入.xlsx文件
  17. 利用百度云流式计算进行大规模设备监控
  18. (5)CC3200学习之串口
  19. Visual studio 2015 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包
  20. 学习1368个单词 - 有关物和人的名词

热门文章

  1. php fastcgi进程启动,Shell脚本实现启动PHP内置FastCGI Server
  2. python中如何判断输入的是英文字母_python如何判断一个字符是否为汉字,英文字母,数字,空还是其他...
  3. python for 循环 多线程_python:for循环中的多线程处理
  4. c51矩形波输出汇编语言,51单片机汇编语言编程:用定时器控制输出矩形波
  5. 是否能被3,5,7同时整除(3.4)(Java)
  6. 【c语言】蓝桥杯算法提高 c++_ch02_02
  7. python在windows和linux_python在windows和linux下获得本机本地ip地址方法小结
  8. PostgreSQL 数据库多列复合索引的字段顺序选择原理
  9. Character流与Byte流的区别
  10. Windows server2012虚拟机 密码重置