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的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...
随机推荐
- 关于python导包问题
讨论采用 * 模糊导入或者 单独导入变量 会在不同文件生成不同的对象 .a └── mypackage ├── a.py ├── b.py ├── c.py b.py内容如下 import c d ...
- mxnet 豆瓣镜像源安装
mxnet安装比较简单,这里直接通过豆瓣镜像源用pip安装 pip install -i https://pypi.doubanio.com/simple/ mxnet-cu100 # 进入ipyth ...
- Python中的序列
Python中有四种内建的数据结构,即列表.元组.字典.集合.其中字典和集合我会以后再写,现在先说列表和元组,它们两个和以前提到很多次的字符串, 其实都属于——序列. 一.列表(list): 1. l ...
- Transformer, ELMo, GPT, 到Bert
RNN:难以并行 CNN:filter只能考虑局部的信息,要叠多层 Self-attention:可以考虑全局的信息,并且可以并行 (Attention Is All You Need) 示意图:x1 ...
- java8学习之收集器枚举特性深度解析与并行流原理
首先先来找出上一次[http://www.cnblogs.com/webor2006/p/8353314.html]在最后举的那个并行流报错的问题,如下: 在来查找出上面异常的原因之前,当然得要一点点 ...
- Java 实现《编译原理》中间代码生成 -逆波兰式生成与计算 - 程序解析
Java 实现<编译原理>中间代码生成 -逆波兰式生成与计算 - 程序解析 编译原理学习笔记 (一)逆波兰式是什么? 逆波兰式(Reverse Polish notation,RPN,或逆 ...
- C#基础进阶
观看C#高级教程进行学习.巩固基础,进阶学习. 1.委托 把方法当做参数来传递就是委托.委托的关键字是delegate. class Program { private delegate string ...
- struts配置访问后缀为.do,.action,.*
Struts 配置文件的加载顺序 Struts-default.xml---> struts-plugin.xml--> struts.xml--> struts.propert ...
- Java技术综述
自己打算好好学习下Java,所以想先明晰Java开发中到底有哪些技术,以便以后学习的过程中,可以循序渐进,随着学习的深入,本文将不断更新. Java基础教程将Java的入门基础知识贯穿在一个实例中,逐 ...
- LOJ-6284-数列分块入门8
链接: https://loj.ac/problem/6284 题意: 给出一个长为 的数列,以及 个操作,操作涉及区间询问等于一个数 的元素,并将这个区间的所有元素改为 . 思路: 维护一个分块是否 ...