• 对图像进行各种变换,如移动,旋转,仿射变换等

变换

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)——几何变换的更多相关文章

  1. opencv学习笔记(七)SVM+HOG

    opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...

  2. opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...

  3. opencv学习笔记(五)镜像对称

    opencv学习笔记(五)镜像对称 设图像的宽度为width,长度为height.(x,y)为变换后的坐标,(x0,y0)为原图像的坐标. 水平镜像变换: 代码实现: #include <ios ...

  4. opencv学习笔记(四)投影

    opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: #include <cv.h> #include <highgui.h> using namespace ...

  5. opencv学习笔记(三)基本数据类型

    opencv学习笔记(三)基本数据类型 类:DataType 将C++数据类型转换为对应的opencv数据类型 OpenCV原始数据类型的特征模版.OpenCV的原始数据类型包括unsigned ch ...

  6. opencv学习笔记(二)寻找轮廓

    opencv学习笔记(二)寻找轮廓 opencv中使用findContours函数来查找轮廓,这个函数的原型为: void findContours(InputOutputArray image, O ...

  7. opencv学习笔记(一)IplImage, CvMat, Mat 的关系

    opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...

  8. paper 93:OpenCV学习笔记大集锦

    整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...

  9. (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...

随机推荐

  1. k-means 非监督学习聚类算法

    非监督学习 非监督学习没有历史样本数据和标签,直接对数据分析或得结果. k-means 使用 >>> from sklearn.cluster import KMeans >& ...

  2. java的移位和异或运算

    Java移位运算种类 基础:我们知道在Java中int类型占32位,可以表示一个正数,也可以表示一个负数.正数换算成二进制后的最高位为0,负数的二进制最高为为1 例子: -5换算成二进制后为:1111 ...

  3. 7、Linux权限管理-基本权限

    1.权限概述 1.1.什么是权限? 我们可以把它理解为操作系统对用户能够执行的功能所设立的限制,主要用于约束用户能对系统所做的操作,以及内容访问的范围,或者说,权限是指某个特定的用户具有特定的系统资源 ...

  4. docker常用命令与容器创建

    ################docker安装##################### Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个 ...

  5. iptables 设置特定IP访问指定端口

    一.添加规则:设置禁止所有IP访问指定端口8075 [root@zabbix_server ~]# iptables -I INPUT -p tcp --dport -j DROP 二.测试telne ...

  6. 504错误解决办法 让你的浏览器强制在后端服务器执行而不用通过前端CDN服务器

      因为后端执行时间过长,前端不等待,导致提示504错误的解决办法 504 错误是因为你的CDN服务器设置的延时有限, 超时导致的504 是前端不等待中止,是前端不行,后端应该正常 502 错误是后端 ...

  7. 阿里云-docker安装mysql

    1.检查内核版本,必须是3.10及以上 uname ‐r 2.安装docker yum install docker 3.输入y确认安装 4.启动docker:service docker start ...

  8. matplotlib动画

    注意:要有动画效果,必须独立窗口:独立窗口的设置方法:https://www.cnblogs.com/liming19680104/p/10614070.html import matplotlib. ...

  9. FM算法详解

    https://blog.csdn.net/jediael_lu/article/details/77772565 https://blog.csdn.net/bitcarmanlee/article ...

  10. 小米手机安装https证书报错:无法安装该证书 因为无法读取该证书文件

    Fiddler]手机安装https证书报错:无法安装该证书 因为无法读取该证书文件   之前在手机上使用 “ip:端口号” 的方法就能直接在手机上自动下载安装fiddler证书,但是现在有些手机并不能 ...