python 几何教学_opencv-python教程学习系列11-几何变换
前言
opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍几何变换,坚持学习,共同进步。
系统环境
系统:win7_x64;
python版本:python3.5.2;
opencv版本:opencv3.3.1;
内容安排
1.知识点介绍;
2.测试代码;
具体内容
1.知识点介绍;
主要涉及函数cv2.getPerspectiveTransform,cv2.warpAffine和cv2.warpPersperctive;
1.1 缩放;
缩放仅仅改变图像尺寸,opencv提供的函数cv2.resize()可以实现此功能。图片的尺寸可以指定尺寸大小,或者指定缩放因子。可以使用不同的插值运算方法,在缩放时推荐的插值运算方法是 cv2.INTER_AREA,在扩展时推荐使用v2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默认情况下改变图像大小的操作使用插值方法是cv2.INTER_LINEAR,可以使用任意一种方法改变图像尺寸。
##None为图像尺寸时,fx和fy参数是缩放因子
res = cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
#or
#这里直接设置输出图像的尺寸,所以不用设置缩放因子
height, width =img.shape[:2]
res = cv2.resize(img,(2*width, 2*height),interpolation=cv2.INTER_CUBIC)
#注意,integer argument expected;那怎么缩小呢??
1.2 平移;
平移就是移动对象位置。如果你知道移动方向(x,y),移动距离是(tx,ty),可以创建如下矩阵。
可以使用Numpy数组构建矩阵,数据类型是np.float32,然后将其传入函数cv2.warpAffine();
函数cv2.warpAffine() 第三个参数是输出图像的大小,格式是图像的(宽,高)。
注意,图像的宽对应的是列数,高对应的是行数。
M = np.float32([[1,0,100], [0,1,50]])
dst = cv2.warpAffine(img, M, (cols,rows))
1.3 旋转;
对一个图像旋转角度θ,旋转矩阵如下:
在opencv中允许在任意地方进行旋转,旋转矩阵如下:
其中,
opencv提供了cv2.getRotationMatrix2D函数来实现旋转矩阵;
M=cv2.getRotationMatrix2D((cols/2,rows/2), 45, 0.6)
#第三个参数是输出图像的尺寸中心
dst=cv2.warpAffine(img, M, (2*cols,2*rows))
1.4 仿射变换;
仿射变换中,原图中的平行线变换后依然平行。创建仿射变换矩阵需要在图像中找三个点和这三个点在输出图像的位置。使用cv2.getAffineTransform函数创建2*3的仿射变换矩阵,矩阵会被传递给cv2.warpAffine函数;
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
#行,列,通道数
M = cv2.getAffineTransform(pts1, pts2)
dst = cv2.warpAffine(img, M, (cols,rows))
1.5 透视变换;
透视变换需要3*3的矩阵,透视变换后直线还是直线,建立透视矩阵需要在图像上找4个点,以及他们在输出图像上的对应位置,这四个点任意三个不能共线。由cv2.getPerspectiveTransform() 构建矩阵,然后将矩阵传递给cv2.warpPerspective函数;
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)
dst = cv2.warpPerspective(img, M, (300,300))
2.测试代码;
2.1 缩放/旋转等;
import cv2
img = cv2.imread('test.jpg',0)
rows,cols=img.shape
#这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
#可以通过设置旋转中心,缩放因子以及窗口大小来防止旋转后超出边界的问题。
M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6)
#第三个参数是输出图像的尺寸中心
dst=cv2.warpAffine(img,M,(2*cols,2*rows))
while(1):
cv2.imshow('img',dst)
if cv2.waitKey(1)==27:
break
cv2.destroyAllWindows()
2.2 仿射/透视变换;
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('test.jpg')
rows,cols,ch=img.shape
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)
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()
参考
完
python 几何教学_opencv-python教程学习系列11-几何变换相关推荐
- python鼠标点击事件event_opencv-python教程学习系列5-处理鼠标事件
前言 opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍opencv-python处理鼠标事件,坚持学习,共同进步. 系统环境 系统:win_x64; p ...
- opencv-python教程学习系列2-读取/显示/保存图像
前言 opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍图像的读取.显示以及保存,坚持学习,共同进步. 系列教程参照OpenCV-Python中文教程: ...
- opencv-python教程学习系列13-图像平滑
前言 opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍图像平滑,坚持学习,共同进步. 系列教程参照OpenCV-Python中文教程: 系统环境 系统: ...
- opencv-python教程学习系列8-opencv图像算术运算
前言 opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍图像的算术运算,坚持学习,共同进步. 系列教程参照OpenCV-Python中文教程: 系统环境 ...
- 狂神学习系列11:SpringBoot
狂神学习系列11:SpringBoot 声明: 本文章是基于狂神的课程所编写,本人才疏学浅,内容仅作参考 项目和markdown文件资料: 07_SpringBoot: 基于狂神说SpringBoot ...
- python免费教学视频教程-Python免费教程_Python免费视频教程大全_易玩网
Python视频教程是一款为广大想要学习Python的小伙伴们量身打造的,让你能够快速的从零开始学起,不管你是菜鸟还是老手,在这里都能够学习到很多相关的知识,喜欢的千万不要错过了哦! [Python视 ...
- python操作redis set_Python操作redis学习系列之(集合)set,redis set详解 (六)
#-*- coding: utf-8 -*- importredis r= redis.Redis(host="126.56.74.190",port=639,password=& ...
- python编程教学软件-Python编程教学app
Python编程教学app一款超级好用的在线编程语言教学软件,内容涵盖基础概念.控制结构.函数模块.文件操作.面试对象.函数编程.异常处理.正则表达式,讲解了python基础知识,也介绍了Scrapy ...
- python在线教学-老男孩Python在线教学|学好Python发展如何?
随着近几年Python的飞速发展,应用范围逐步趋于广泛,后端开发.前端开发.爬虫.金融量化分析.人工智能.自动化运维.自动化运维.大数据,Python都有涉及.Python相对其他编程语言来讲,语法较 ...
最新文章
- 烂泥:nginx同时支持asp.net与php
- Nginx的rewrite之set指令
- 用Linux命令行生成随机密码的十种方法
- 各大厂抢招WPF,小米这回是下了血本啊...
- 如何做一个高效率的程序员,对程序员也是很重要。。
- 从现实抽象出类的步骤
- 100个人奇数枪毙Java,在JAVA中用for循环编写程序计算1~100之间的奇数之和
- PMP证书考试攻略:项目管理考试技巧篇(名师分享PPT)
- 用计算机表白教程,抖音短视频vbs表白代码使用教程
- 量子计算机 叉院,清华团队首次实现量子GAN 准确率98.8%
- react如何获取input值_react中怎么获取input的值?
- 好喝的阿拉伯咖啡Gahwa
- 解决wordcloud导出图片不清楚
- 身份证号的每位数字的意义
- 实验七 H.264编码实验
- 怎样快速解决EDIUS中文件无法打开问题
- ubuntu 18共享文件夹不显示问题解决
- v搜 visio 19版本 学生使用方法
- 小白如何用苹果CMS打造一个电影网站?
- 用java画爱心图_java实现心形图案桃心
热门文章
- 设计模式 策略模式2 c++11
- Oracle 数据库中对记录进行分页处理
- 久等了,41连开班仪式!
- sharepoint站点移植方案
- 212. Word Search II:多个单词查找
- [运动][组合]睡前运动
- Android11怎么截屏,对标IOS?Android11或无缘屏幕长截图
- Linux 4.15 rc7,Linux学习之十五(sed命令)-2017-4-23
- java string replace 重载_关于Java:如何使用replace(char,char)替换字符b的所有实例为空...
- 866. 试除法判定质数