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的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...
随机推荐
- eclipse导入myeclipse中的项目(如何把Webroot改为WebContent)
1.进入项目目录,找到.project文件,打开. 2.找到…代码段. 3.在第2步的代码段中加入如下标签内容并保存: org.eclipse.wst.common.project.facet.cor ...
- vue配置路由时报错 Error in render: "RangeError: Maximum call stack size exceeded"
虽然标题写的是配置路由报错,最终也是通过修改路由解决的,但是导致报错的还有一个主要因素,是因为我增加了一个功能“页面刷新时,根据url高亮左侧导航”,如下图: 1.页面刷新,根据url高亮左侧导航代码 ...
- orcle_day01
Oracle: 数据库,1,认识数据库 数据库:数据的仓库,保存大量数据的地方,有利于对数据的维护.增删改查很方便. 数据库分类: 层次型数据库:现实世界中很多事物是按层次组织起来的.层次数据模型的提 ...
- Apache提示You don't have permission to access / on this server 解决
本文链接:https://blog.csdn.net/Niu_Eva/article/details/90741894 Apache提示You don’t have permission to acc ...
- java同步锁实现方法
1.synchronized关键字修饰 当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就处于阻塞状态 synchronized关键字也可以修饰静态方法,此 ...
- 个人学习SpringMVC总结
好记性不如烂笔头! 核心:前端控制器 处理器映射器(HandleMapping) 处理器适配器(HandleAdapter) 视图解析器 流程: 用户从浏览器发起请求,发送到服务器(Tomcat),由 ...
- 前端杂谈: Attribute VS Property
前端杂谈: Attribute VS Property 第一个问题: 什么是 attribute & 什么是 property ? attribute 是我们在 html 代码中经常看到的键值 ...
- Spring MVC 的 multipartResolver 不能同iWebOffice2006 共同使用
转:http://jamesby.iteye.com/blog/57381 项目使用iWebOffice2006,本来可以正常使用,但是系统有文件上传需求,故定义了一个multipartResolve ...
- Java多线程和并发(二),Thread中的start和run的区别
目录 1.调用run方法 2.调用start方法 3.start和run的区别 二.Thread中的start和run的区别 1.调用run方法 public class ThreadTest { p ...
- luoguP2285 [HNOI2004]打鼹鼠 x
P2285 [HNOI2004]打鼹鼠 题目描述 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿牛编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某 ...