OpenCV学习笔记(6)——几何变换
- 对图像进行各种变换,如移动,旋转,仿射变换等
变换
opencv提供了两个变换函数cv2.warpAffine cv2.warpPerspective使用这两个函数你可以实现所有类型的变换。前者接收的参数是2*3的变换矩阵,后者接收的是3*3的变换矩阵
1. 扩展缩放
扩展缩放知识改变图像的尺寸大小。opencv提供的函数cv2.resize()可以实现这个功能。图像的尺寸可以自己手动设置,也可以指定缩放因子。插值方法也有多种选择,缩放时推荐使用cv2.INTER_AREA,扩展时推荐使用cv2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默认情况下所有改变图像尺寸大小的操作使用的都是cv2.INTER_LINEAR。例程如下:
# -*- coding:utf-8 -*- import numpy as np
import cv2 img = cv2.imread('2.jpg') res = cv2.resize(img, None, fx = 0.5, fy = 0.5, interpolation = cv2.INTER_AREA)#设置缩放因子的写法 height,width = img.shape[:2]
res1 = cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC)#直接设置输出图像的尺寸的方式
res2 = cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_LINEAR) cv2.imshow('res',res)
cv2.imshow('res1',res1)
cv2.imshow('res2',res2)
cv2.imshow('img',img) cv2.waitKey(0)
cv2.destroyAllWindows()
注意两种改变尺寸的用法(缩放因子法和设置输出图像尺寸法)
2.平移
平移就是将对象换一个位置。如果要将图像沿(x,y)方向移动,移动距离是(tx,ty),可以按下面的方式构建矩阵:

然后将这个矩阵传给cv2.warpAffine()。M矩阵可以用Numpy构建这个矩阵(矩阵类型为np.float32),例程如下:
import numpy as np
import cv2 img = cv2.imread('2.jpg') M = np.float32([[1,0,100],[0,1,50]])#注意这里必须是这个类型的矩阵
rows,cols = img.shape[:2]#输出顺序是高,宽
res = cv2.warpAffine(img,M,(cols,rows))#这里第三个参数是输出图像的(宽,高)
cv2.imshow('img',img)
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.旋转
对一个图像旋转一个角度,需要用到下面形式 的旋转矩阵

但是opencv 允许你在任意地方进行旋转,只是旋转矩阵需要修改为

其中

为了构建这个旋转矩阵,opencv提供了一个函数:cv2.getRotationMatrix2D 下面的例子就是在缩放0.5倍的情况下将图像旋转90°:
# -*- coding:utf-8 -*-
import numpy as np
import cv2
img = cv2.imread('2.jpg')
rows,cols = img .shape[:2]
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,0.5)#第一个参数是旋转中心,第二个是旋转角度(逆时针),第三个是缩放因子
#这个方法还可以用来缩放或扩展图片
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.仿射变换
在仿射变换中,原图在所有的平行线在输出图像中同样平行。为了创建这个矩阵我们需要从原图像中找到三个点以及他们在输出图像中的位置。然后用cv2.getAffineTransform创建一个2*3的矩阵,最后这个矩阵会被传给cv2.warpAffine。其实就是以坐标轴变化带来图像变换,只是坐标轴怎么变的需要3个点来确定。
例程如下:
import numpy as np
import cv2 img = cv2.imread('2.jpg') rows,cols = img.shape[:2] 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)) cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果如下:
---> 
5.透视变换
对于视角变换,我们需要一个3*3变换矩阵。在变换前后直线还是直线。要构建这个变换矩阵,你需要在输入图像上找4个点,以及他们在输出图像上对应的位置。这四个点钟任意三个都不能共线。这个变换矩阵可以用cv2.gerPerspectiveTransform()构建。然后把这个矩阵传给函数cv2.warpPerspective。
实际效果类似与局部放大的感觉。
例程如下:
# -*- coding:utf-8 -*- import numpy as np
import cv2
from matplotlib import pyplot as plt img = cv2.imread('5.jpg') rows,cols = img.shape[:2] 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)) cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
---> 
OpenCV学习笔记(6)——几何变换的更多相关文章
- opencv学习笔记(七)SVM+HOG
opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...
- opencv学习笔记(六)直方图比较图片相似度
opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...
- opencv学习笔记(五)镜像对称
opencv学习笔记(五)镜像对称 设图像的宽度为width,长度为height.(x,y)为变换后的坐标,(x0,y0)为原图像的坐标. 水平镜像变换: 代码实现: #include <ios ...
- opencv学习笔记(四)投影
opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: #include <cv.h> #include <highgui.h> using namespace ...
- opencv学习笔记(三)基本数据类型
opencv学习笔记(三)基本数据类型 类:DataType 将C++数据类型转换为对应的opencv数据类型 OpenCV原始数据类型的特征模版.OpenCV的原始数据类型包括unsigned ch ...
- opencv学习笔记(二)寻找轮廓
opencv学习笔记(二)寻找轮廓 opencv中使用findContours函数来查找轮廓,这个函数的原型为: void findContours(InputOutputArray image, O ...
- opencv学习笔记(一)IplImage, CvMat, Mat 的关系
opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...
- paper 93:OpenCV学习笔记大集锦
整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...
- (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU
首页 视界智尚 算法技术 每日技术 来打我呀 注册 OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...
随机推荐
- Delphi 文件的编程
- automake中Makefile.am和configure.ac的格式及编译过程
step1:写Makefile.am step2:执行autoscan,会生成configurae.scan,修改configure.scan内容之后,命名为configure.ac step3:执行 ...
- Python enumerate 使用技巧
enumerate() 是Python内建的函数,能让打印的结果更清晰,不管是列表,元组,字典,enumerate()都可以帮你完成,在某些需求下还是非常好用的. >>> a = [ ...
- 【AGC006 C】Rabbit Exercise
题意 有 \(n\) 只兔子在数轴上,第 \(i\) 只兔子的初始坐标为整数 \(x_i\). 现在这些兔子会按照下面的规则做体操.每一轮体操都由 \(m\) 次跳跃组成:在第 \(j\) 次跳跃时, ...
- 关于ORACLE事务处理的一些笔记
这是2013年在看ORACLE概念手册的时候的一些笔记,现在整理如下(可能跟其他一些文章的内容有重复): 20131012 周六 oracle概念手册中文版 第4章 事务管理 事务具有原子 ...
- ab测试nginx Nginx性能优化
转自:https://www.cnblogs.com/nulige/p/9369700.html 1.性能优化概述 在做性能优化前, 我们需要对如下进行考虑 1.当前系统结构瓶颈 观察指标 压力测试 ...
- hihocoder1384/CH0601 Genius ACM[贪心+倍增+归并排序]
提交地址. 关于lyd给的倍增方法,即从当前枚举向后的$2^k$长度($k$从$1$开始),如果可行就将$k$加一以扩大范围,不可行时将范围不断减半直至$0$. 举个例子,假设当下在1,目标答案是13 ...
- http学习--常用请求方法和响应状态码
常用的http请求方法: GET方法:请求服务器资源,并返回 POST方法:向指定资源提交数据进行处理请求(比如说表单,上传文件等).数据被包含在请求体中.POST请求可能会导致新的资源建立或已有资源 ...
- 日志管理-rsyslog日志服务器及loganalyzer
一,日志基础 日志:记录时间,地点,任务,事件 格式:日期时间 主机 进程[pid]: 事件内容 rsyslog 特性: 多线程,UDP, TCP, SSL, TLS, RELP,MySQL, PGS ...
- node之events 模块,并通过实例化 EventEmitter 类来绑定和监听事件
例子来源:http://www.runoob.com/nodejs/nodejs-event-loop.html http://www.runoob.com/nodejs/nodejs-event.h ...