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的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...
随机推荐
- java接口自动化测试小dome
GitHub地址:https://github.com/leonInShanghai/InterfaceAutomation 这个dome 请求 https://www.v2ex.com/api/no ...
- ShuffleNet系列学习笔记
ShuffleNet是旷世提出的高效轻量化网络,是一款很值得一提的轻量化网络,其相关论文也是很有价值的. ShuffleNet V1 该网络提出于2017年,论文为<ShuffleNet: An ...
- c++实现服务器和多个客户端的实时群聊通信
我们通过TCP/IP来实现多人聊天室,如果租一个服务器我们就可以实现全网的多人聊天室(不懂tcp/ip的点进来https://www.cnblogs.com/yskn/p/9335608.html)! ...
- springboot中使用拦截器
5.1 回顾SpringMVC使用拦截器步骤 自定义拦截器类,实现HandlerInterceptor接口 注册拦截器类 5.2 Spring Boot使用拦截器步骤 5.2.1 按照S ...
- Java注解demo
# 为了熟悉了解注解,写的一个小demo# demo的主要功能是扫描一个class中的包含我们自定义注解的方法,然后把他们的返回值放到一个map中 public class QQ { public s ...
- python3之selenium.webdriver 库练习自动化谷歌浏览器打开百度自动百度关键字
import os,time,threading from selenium import webdriver from selenium.webdriver.common.keys import K ...
- TO B是什么?TO C呢?
总是听别人说 to B. to C 的 所以了解一下这个概念: 一.基本概念 1. TO B,B指的是== business==,中文即商业,企业: 2. TO C,C指的是customer, ...
- 命令方式 搭建 (简易)Maven项目
原料:1.配好的Maven环境变量 2.c m d命令 win + r 输入 cmd 切换到此项目所要存在的位置 使用命令创建文件夹 切换 到 maven_demo中 输入 cd mave ...
- grunt-contrib-jshint js代码检查
grunt-contrib-jshint:用于javascript代码检查(并会给出建议),发布js代码前执行jshint任务, 可以避免出现一些低级语法问题jshint拥有非常丰富的配置,可以自由控 ...
- idea生成实体类
1.点击View->Tool Windows->Database 2.点击Datebase框的加号,DateSource,选择对应的数据源,配置对应信息,点击Test Connection ...