第十三节,OPenCV学习(二)图像的简单几何变换
图像的简单几何变换
几何变换不改变图像的像素值,只是在图像平面上进行像素的重新安排
适当的几何变换可以最大程度地消除由于成像角度、透视关系乃至镜头自身原因所造成的几何失真所产生的的负面影响。
一、图像的平移
在平移之前,需要构造一个平移矩阵,并将其传给仿射函数cv2.warpAffine()
import cv2
import numpy as np img = cv2.imread('dog.jpg')
# 构造平移矩阵H
H = np.float32([[1,0,50],[0,1,25]])
rows, cols = img.shape[:2]
print(img.shape)
print(rows,cols)
res = cv2.warpAffine(img,H,(cols,rows))
cv2.imshow('origin_img',img)
cv2.imshow('new_img',res)
cv2.waitKey(0)
cv2.destroyAllWindows()

二、图像的放大和缩小
图像的放大和缩小有一个专门的函数,cv2.resize(),需要设置缩放的比例,一种办法是设置缩放因子,另一种办法是直接设置图像的大小,在缩放以后,图像必然会发生变化,涉及图像的插值问题。
缩放有几种不同的插值(interpolation)方法,在缩小时推荐使用cv2.INTER_AREA,扩大时推荐使用cv2.INTER_CUBIC和cv2.INTER_LINEAR。
import cv2
import numpy as np
img = cv2.imread('dog.jpg')
# 一是通过设置图像缩放比例,即缩放因子
res1 = cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_LINEAR)
height,width = img.shape[:2]
# 而是直接设置图像的大小
res2 = cv2.resize(img,(int(0.8*width),int(0.8*height)),interpolation=cv2.INTER_AREA)
cv2.imshow('origin',img)
cv2.imshow('res1',res1)
cv2.imshow('res2',res2)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、图像的旋转
对于图像的旋转,需要构造旋转矩阵,一般图像的旋转矩阵是在原点处进行的:

OpenCV采用了另一种方式:

cv2.getRotationMarix2D( )函数需要三个参数:旋转中心、旋转角度、旋转后图像的缩放比例:
import cv2
import numpy as np img = cv2.imread('dog.jpg')
rows, cols = img.shape[:2]
# 第一个参数是旋转中心,第二个参数是旋转角度,第三个参数是缩放比例
M1 = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 0.5)
M2 = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 2)
M3 = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 1)
res1 = cv2.warpAffine(img, M1, (cols, rows))
res2 = cv2.warpAffine(img, M2, (cols, rows))
res3 = cv2.warpAffine(img, M3, (cols, rows))
cv2.imshow('res1', res1)
cv2.imshow('res2', res2)
cv2.imshow('res3', res3)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、图像的仿射
仿射变换是指在向量空间中进行一次线性变换(乘以一个矩阵)并加上一个平移,变换为另一个向量空间的过程。
仿射变化也是需要一个M矩阵就可以,但是由于仿射变换比较复杂,很难找到这个矩阵,opencv提供了根据变换前后三个点的对应关系来自动求解M, 这个函数是cv2.getAffineTransoform(pts1, pts2)事实上,仿射变换代表的是两幅图之间的关系,我们通常使用2x3矩阵来表示仿射变换如下:
import cv2
import numpy as np
img = cv2.imread('dog.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)
res = cv2.warpAffine(img, M, (cols, rows))
cv2.imshow('origin', img)
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

五、图像的透射
仿射变换(affinetransform)与透视变换(prespectivetransform)在图像还原、图像局部变化处理方面有重要意义。
import cv2
import numpy as np
img = cv2.imread('dog.jpg')
rows, cols = img.shape[:2]
pts1 = np.float32([[56, 65], [238, 52], [28, 237], [239, 240]])
pts2 = np.float32([[0, 0], [200, 0], [0, 200], [200, 200]])
M = cv2.getPerspectiveTransform(pts1, pts2)
res = cv2.warpPerspective(img, M, (cols, rows))
cv2.imshow('yuantu', img)
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

第十三节,OPenCV学习(二)图像的简单几何变换的更多相关文章
- opencv学习笔记-图像对比度、亮度调节
在数学中我们学过线性理论,在图像亮度和对比度调节中同样适用,看下面这个公式: 在图像像素中其中: 参数f(x)表示源图像像素. 参数g(x) 表示输出图像像素. 参数a(需要满足a>0)被称为增 ...
- opencv学习笔记-图像叠加、混合
在图像处理中,目标区域定义为感兴趣区域ROI(region of Interest),这是后期图像处理的基础,在获取ROI后,进行一些列的处理.ROI区域在Opencv中就是Rect,先构建Rect, ...
- Python下的OpenCV学习 02 —— 图像的读取与保存
OpenCV提供了众多对图片操作的函数,其中最基本的就是图片的读取与输出了. 一.读取图片 利用OpenCV读取一张图片是非常容易的,只需要用到 imread() 函数,打开shell或者cmd,进入 ...
- opencv学习(一)——图像入门
图像入门 一.读取图像 在opencv中使用cv.imread(filename, flags)函数读取图像.filename参数表示读取图像的路径.读取图像的路径应完整给出,且不能含有中文,否则在调 ...
- opencv学习(六)——图像基本操作
图像基本操作 一.访问和修改像素值 先来理解一下,图像与一般的矩阵或张量有何不同(不考虑图像的格式,元数据等信息).首先,一张图像有自己的属性,宽,高,通道数.其中宽和高是我们肉眼可见的属性,而通道数 ...
- opencv学习笔记——图像缩放函数resize
opencv提供了一种图像缩放函数 功能:实现对输入图像缩放到指定大小 函数原型: void cv::resize ( InputArray src, OutputArray dst, Size ds ...
- OpenCV学习(11) 图像的腐蚀与膨胀(2)
先对一副灰度图像进行腐蚀操作,然后在腐蚀后的图像上再进行膨胀操作,我们定义这个操作为开操作. 先对一副图像进行膨胀操作,然后在膨胀后的图像上再进行腐蚀操作,我们定义这个操作为闭操作. 开操 ...
- OpenCV学习(10) 图像的腐蚀与膨胀(1)
建议大家看看网络视频教程:http://www.opencvchina.com/thread-886-1-1.html 腐蚀与膨胀都是针对灰度图的形态学操作,比如下面的一副16*16的灰度图. ...
- OpenCV学习笔记——图像的腐蚀与膨胀
顺便又复习了一下cvcopy如何进行图像拼接(最近觉得打开多幅图像分别看不如缩小掉放拼接到一幅图像上对比来的好) 首先把拼接的目标图像设置兴趣区域ROI,比如我有一个total,要把a.b.c分别从左 ...
随机推荐
- Map the Debris 轨道周期
返回一个数组,其内容是把原数组中对应元素的平均海拔转换成其对应的轨道周期. 原数组中会包含格式化的对象内容,像这样 {name: 'name', avgAlt: avgAlt}. 至于轨道周期怎么求, ...
- [c++项目]迷宫 控制台游戏
#include<stdio.h> #include<windows.h> #include<stdlib.h> #include<time.h> #i ...
- spring整合redis使用RedisTemplate的坑Could not get a resource from the pool
一.背景 项目中使用spring框架整合redis,使用框架封装的RedisTemplate来实现数据的增删改查,项目上线后,我发现运行一段时间后,会出现异常Could not get a resou ...
- centos6.5之phpmyadmin安装
PhpMyAdmin 首先我们看一下百度百科,看一下phpmyadmin是做什么的. phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让 ...
- WebSocket原理
一 . WebSocket原理 1.1.背景 WebSocket 是基于Http 协议的改进,Http 为无状态协议,基于短连接,需要频繁的发起请求,第二 Http 只能客户端发起请求,服务端无法主动 ...
- C++开发python windows版本的扩展模块示例
C++开发python windows版本的扩展模块示例 测试环境介绍和准备 测试环境: 操作系统:windows10 Python版本:3.7.0 VS版本:vs2015社区版(免费) 相关工具下载 ...
- Java中JSON之全
1. 在不知道你要转的对象的类型的时候,用com.alibaba.fastjson.JSON.parse(); Object parse = com.alibaba.fas ...
- 小白月赛13 小A与小B (双向BFS)
链接:https://ac.nowcoder.com/acm/contest/549/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- linux 常用命令集锦
喝断片儿了,我是谁?我在什么地方?我做过些什么事?查看当前用户 who am i查看当前路径 pwd查看历史记录 history 我忘了程序放哪了,就记得个名.更新系统数据库 updatedb查找文件 ...
- hbuilder、hbuilderx和vscode对比
1. 从内存来对比 1.1 vscode占用内存 打开同一个项目,发现vscode占用内存比较多 1.2 HBuilder占用内存 1.3 HBuilderx占用内存 1.4 对比 从内存上来看,HB ...