使用OpenCV实现仿射变换—平移功能


Posted in Python onAugust 29, 2019

当我们打开一个图片编辑软件时,基本上都会提供几个操作:平移、缩放和旋转。特别目前在手机里拍照时,由于位置传感器的失灵,也许是软件的BUG,有一次我就遇到苹果手机不管怎么样竖放,或横放,它拍摄的照片就竖不起来,后来只有关机重启才解决。这样拍摄出来的照片,如果要改变方向,只能使用编辑功能了,进行旋转。因此,几何变换的功能,在现实生活里的需求必不可少。

为了理解这个几何的问题,可以来回忆一下初中的课本内容:

使用OpenCV实现仿射变换—平移功能

从这里可以看到平移的基本性质,有了这些概念之后,就要进入解释几何,平移的表达,比如往x轴移动100,那么就是x+100,因此平移的公式就是(x1, y1)=(x+a, y+b),如下图所示:

使用OpenCV实现仿射变换—平移功能

从这个线性方程组来看,是一个二元的关系,再转换为矩阵的表示方式,你会发现使用的方式是如下:

使用OpenCV实现仿射变换—平移功能

在这里发现是使用三维矩阵来表示,为什么要这样呢?其实是为了把三种变换统一到一种表示方式,升维思想的作用。因此矩阵第三行没有什么作用的,如果一个图像要作平移,只要构造出变换矩阵,再作这个计算,就可以把坐标进行改变了,所以要平移的距离是由tx和ty决定。为了统一,旋转、缩放、平移都可以使用一个公式来表示和计算,这是升到三维数组的好处。同样在三维空间的变换,也是采用四维变换矩阵。下面通例子来演示图像平移的操作:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
 
#图片的路径
imgname = "img1.jpg"
 
#读取图片
image = cv2.imread(imgname, cv2.IMREAD_COLOR)
 
#图片的高度和宽度
h,w = image.shape[:2]
 
#构造平移的2X3的矩阵,然后调用warpAffine执行平移
A1 = np.array([[1, 0, 50], [0, 1, 40]], np.float32)
d1 = cv2.warpAffine(image, A1, (w, h), borderValue = 125)
 
#显示平移之后的图片
cv2.imshow("d1",d1)
 
#显示图像
cv2.imshow("image", image)
 
#等待用户输入,然后删除所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

执行的结果如下:

使用OpenCV实现仿射变换—平移功能

左图是平移之后的图片,在左上角出现了一片空白,使用了固定颜色填充,右图是原始图片。

在这里主要使用cv2.warpAffine函数,这个函数定义如下:

cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst

其中:

src - 输入图像。

M - 变换矩阵。

dsize - 输出图像的大小。

flags - 插值方法的组合(int 类型!)

borderMode - 边界像素模式(int 类型!)

borderValue - 边界填充值; 默认情况下,它为0。

上述参数中:M作为仿射变换矩阵,一般反映平移或旋转的关系,为InputArray类型的2×3的变换矩阵。

flages表示插值方式,默认为 flags=cv2.INTER_LINEAR,表示线性插值,此外还有:cv2.INTER_NEAREST(最近邻插值) cv2.INTER_AREA (区域插值) cv2.INTER_CUBIC(三次样条插值) cv2.INTER_LANCZOS4(Lanczos插值)

到这里学会了使用OpenCV中仿射变换的平移功能。

总结

以上所述是小编给大家介绍的使用OpenCV实现仿射变换—平移功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python计算书页码的统计数字问题实例
Sep 26 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
Mar 31 Python
在Python的Bottle框架中使用微信API的示例
Apr 23 Python
在Python的Django框架中生成CSV文件的方法
Jul 22 Python
Python中进程和线程的区别详解
Oct 29 Python
对python中类的继承与方法重写介绍
Jan 20 Python
在numpy矩阵中令小于0的元素改为0的实例
Jan 26 Python
Python获取Redis所有Key以及内容的方法
Feb 19 Python
python:批量统计xml中各类目标的数量案例
Mar 10 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
Sep 21 Python
python爬虫scrapy框架之增量式爬虫的示例代码
Feb 26 Python
Pygame Rect区域位置的使用(图文)
Nov 17 Python
python网络编程 使用UDP、TCP协议收发信息详解
Aug 29 #Python
使用OpenCV实现仿射变换—缩放功能
Aug 29 #Python
python实现两个文件夹的同步
Aug 29 #Python
使用OpenCV实现仿射变换—旋转功能
Aug 29 #Python
python+rsync精确同步指定格式文件
Aug 29 #Python
django-rest-swagger对API接口注释的方法
Aug 29 #Python
Python3视频转字符动画的实例代码
Aug 29 #Python
You might like
Windows下PHP5和Apache的安装与配置
2006/09/05 PHP
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
jQuery Div中加载其他页面的实现代码
2009/02/27 Javascript
面向对象的javascript(笔记)
2009/10/06 Javascript
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
2010/03/14 Javascript
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
javascript 初学教程及五子棋小程序的简单实现
2017/07/04 Javascript
Vue组件开发技巧总结
2018/03/04 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
原生js实现下拉框选择组件
2021/01/20 Javascript
python学生管理系统代码实现
2020/04/05 Python
Pandas 同元素多列去重的实例
2018/07/03 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
python实现根据指定字符截取对应的行的内容方法
2018/10/23 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
python3.6环境安装+pip环境配置教程图文详解
2019/06/20 Python
在Python中实现函数重载的示例代码
2019/12/12 Python
从pandas一个单元格的字符串中提取字符串方式
2019/12/17 Python
Python新手学习raise用法
2020/06/03 Python
Django之腾讯云短信的实现
2020/06/12 Python
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
大学生入党自我鉴定
2013/10/31 职场文书
小学生安全保证书
2014/02/01 职场文书
运动会入场词100字
2014/02/06 职场文书
大学军训感言300字
2014/03/09 职场文书
政风行风整改方案
2014/10/25 职场文书
企业财务总监岗位职责
2015/04/03 职场文书
承诺书模板大全
2015/05/04 职场文书
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB