OpenCV-Python:IV OpenCV中的图像处理

14 几何变换

目标:
  • 学习对图像进行各种几个变换,例如移动,旋转,仿射变换等。
  • 将要学到的函数有:cv2.getPerspectiveTransform。

变换:
OpenCV 提供了两个变换函数,cv2.warpAffine 和 cv2.warpPerspective,使用这两个函数你可以实现所有类型的变换。cv2.warpAffine 接收的参数是2 × 3 的变换矩阵,而 cv2.warpPerspective 接收的参数是 3 × 3 的变换矩阵。

14.1 扩展缩放

扩展缩放只是改变图像的尺寸大小。OpenCV 提供的函数 cv2.resize()可以实现这个功能。图像的尺寸可以自己手动设置,你也可以指定缩放因子。我们可以选择使用不同的插值方法。在缩放时我们推荐使用 cv2.INTER_AREA,在扩展时我们推荐使用 v2.INTER_CUBIC(慢) 和 v2.INTER_LINEAR。默认情况下所有改变图像尺寸大小的操作使用的插值方法都是 cv2.INTER_LINEAR。你可以使用下面任意一种方法改变图像的尺寸:

import cv2
import numpy as np
img=cv2.imread('messi5.jpg')
# 下面的 None 本应该是输出图像的尺寸,但是因为后边我们设置了缩放因子
# 因此这里为 None
res=cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
#OR
# 这里呢,我们直接设置输出图像的尺寸,所以不用设置缩放因子
height,width=img.shape[:2]
res=cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC)
while(1):
cv2.imshow('res',res)
cv2.imshow('img',img)
if cv2.waitKey(1) & 0xFF == 27:
break
cv2.destroyAllWindows()
# Resize(src, dst, interpolation=CV_INTER_LINEAR)

14.2 平移

平移就是将对象换一个位置。如果你要沿(x,y)方向移动,移动的距离是(t x ,t y ),你可以以下面的方式构建移动矩阵:

你可以使用 Numpy 数组构建这个矩阵(数据类型是 np.float32),然后把它传给函数 cv2.warpAffine()。看看下面这个例子吧,它被移动了(100,50)个像素。

import cv2
import numpy as np img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows)) cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

警告:函数 cv2.warpAffine() 的第三个参数的是输出图像的大小,它的格式应该是图像的(宽,高)。应该记住的是图像的宽对应的是列数,高对应的是行数。
下面就是结果:

14.3 旋转

对一个图像旋转角度 θ, 需要使用到下面形式的旋转矩阵。
      
但是 OpenCV 允许你在任意地方进行旋转,但是旋转矩阵的形式应该修
改为
      

其中:
      
为了构建这个旋转矩阵,OpenCV 提供了一个函数:cv2.getRotationMatrix2D。
下面的例子是在不缩放的情况下将图像旋转 90 度。

import cv2
import numpy as np
img=cv2.imread('messi5.jpg',0)
rows,cols=img.shape
# 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
# 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题
M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6)
# 第三个参数是输出图像的尺寸中心
dst=cv2.warpAffine(img,M,(2*cols,2*rows))
while(1):
cv2.imshow('img',dst)
if cv2.waitKey(1)&0xFF==27:
break
cv2.destroyAllWindows()

下面是结果:

14.4 仿射变换

在仿射变换中,原图中所有的平行线在结果图像中同样平行。为了创建这个矩阵我们需要从原图像中找到三个点以及他们在输出图像中的位置。然后cv2.getAffineTransform 会创建一个 2x3 的矩阵,最后这个矩阵会被传给函数 cv2.warpAffine。
来看看下面的例子,以及我选择的点(被标记为绿色的点)

img = cv2.imread('drawing.png')
rows,cols,ch = img.shape 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)) plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

下面是结果:

14.5 透视变换

对于视角变换,我们需要一个 3x3 变换矩阵。在变换前后直线还是直线。要构建这个变换矩阵,你需要在输入图像上找 4 个点,以及他们在输出图像上对应的位置。这四个点中的任意三个都不能共线。这个变换矩阵可以有函数 cv2.getPerspectiveTransform() 构建。然后把这个矩阵传给函数cv2.warpPerspective。
代码如下:

img = cv2.imread('sudokusmall.png')
rows,cols,ch = img.shape 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)) plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

结果如下:


更多内容请关注公众号:

[OpenCV-Python] 14 几何变换的更多相关文章

  1. Erlang/Elixir: 使用 OpenCV, Python 搭建图片缩略图服务器

    这篇文章是在OSX上测试和运行的的, Ubuntu下的安装和配置请移步到这里 应用程序进程树, 默认 Poolboy 中初始化10个用于处理图片的 Python 工作进程(Worker) 首先安装Op ...

  2. Ubuntu系统---安装Caffe (+OpenCV+Python+CPU-only)

    安装配置Ubuntu14.04+Caffe (+OpenCV+Python+CPU-only) 记录 [作者:Wu Ping.时间:20180428.] 本人已经安装很多次的Caffe了:从开始的初探 ...

  3. OpenCV Python教程(3、直方图的计算与显示)

    转载请详细注明原作者及出处,谢谢! 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途什么的就直接略过去了. ...

  4. OpenCV + python 实现人脸检测(基于照片和视频进行检测)

    OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...

  5. opencv+python视频实时质心显示

    利用opencv+python实现以下功能: 1)获取实时视频,分解帧频: 2)将视频做二值化处理: 3) 将视频做滤波处理(去除噪点,获取准确轮廓个数): 4)识别图像轮廓: 5)计算质心: 6)描 ...

  6. opencv python实用操作

    画多边形 fillConvexPloy与fillConvexPloy的区别 fillConvexPloy 用来画单个凸多边形: 如果点集的连线不是凹多边形,则会找一个最小的凸多边形把该凹多边形包住画出 ...

  7. Win7 64bit+Anaconda(3-5.0.1,Python3.6)+Pycharm(community-2017.3.3)+OpenCV(python‑3.4.0‑cp36‑cp36m)(转载)

    Anaconda(3-5.0.1,Python3.6)下载链接:https://pan.baidu.com/s/1bqFwLMB 密码:37ih Pycharm(community-2017.3.3) ...

  8. 解决Windows Server 2012 R2 Datacenter云服务器无法运行opencv python程序的问题

    写了个基于opencv的python程序,pyinstaller 32位机打包后在win7/win10 32/64正常运行,在Windows Server 2012 R2 Datacenter云服务器 ...

  9. OpenCV Python 4.0安装

    1.安装OpenCV-Python 如果你是第一次使用OpenCV Python开发包,想要安装OpenCV Python4.0只要执行如下命令行即可: pip install opencv-pyth ...

  10. Python 图像处理 OpenCV (14):图像金字塔

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

随机推荐

  1. 用for打印九九乘法表

    package com.jiemo.struct;public class ForShabi4 { public static void main(String[] args) { //1.先打印第一 ...

  2. linux端口映射,telnet通信失败

    linux端口映射 1.第一种方法, 使用firewalld # 开启伪装IP firewall-cmd --permanent --add-masquerade # 配置端口转发,将到达本机的123 ...

  3. python基础学习——数据容器

    1.数据容器相当于C的数组 有list,tuple(元组),str,set(集合),dict五种数据容器 2.list(列表) 列表中可存在不同的数据类型,可嵌套 #反向索引 name_list = ...

  4. el-select的正确用法

    下拉框应该是大家非常常用的一个组件,表单几乎离不开它,可是用了三年后我突然发现我一直没有正确的使用它..... ElementUI 组件一直让我纠结的地方是 绑定的值对我来说经常需要绑定值的其他字段信 ...

  5. .net 学习必须学的书籍,新手必备,老手升级必须品!!!

    最近看到一篇文章 是关于学习.net的数据 给大家看看. <<第一篇:>> 人身为一个典型的技术宅,平时看了一些技术书籍.算不上是"博览群书",但也涉猎不少 ...

  6. Swagger-ApiOperation-value属性

    1.value属性设置 @ApiOperation(value="${province}.getUsers", notes="描述") Documentatio ...

  7. DRF的序列化器Serializer

    一 序列化器的作用 1. 序列化,序列化器会把模型对象转换成字典,经过视图中response对象以后变成json字符串 2. 反序列化,视图中request会把客户端发送过来的数据转换成字典,序列化器 ...

  8. Linux shell字符操作总结

    各符号介绍 字符串长度统计 ${#string}: 字符串string的长度 字符串截取 ${string#*substring}: 从左到右截取特定字符substring第一次出现位置之后的字符串 ...

  9. DVWA-SQL Injection (Bind) SQL盲注

    盲注同于union select查询注入,盲注只能得到数据库回显的正确和错误,利用返回的正确和错误一个一个判断. LOW 审计源码 <?php if( isset( $_GET[ 'Submit ...

  10. Android studio软件的安装过程详解

    步骤详解 进入官网,下载相关软件 官网地址:https://developer.android.google.cn/studio/ 点击该页面里面的这个按钮,就能够很轻松地完成下载操作: 弹出弹窗,继 ...