使用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网络编程学习笔记(二):socket建立网络客户端
Jun 09 Python
Python 序列化 pickle/cPickle模块使用介绍
Nov 30 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
Python文件循环写入行时防止覆盖的解决方法
Nov 09 Python
Django-Rest-Framework 权限管理源码浅析(小结)
Nov 12 Python
Python玩转Excel的读写改实例
Feb 22 Python
Pandas 缺失数据处理的实现
Nov 04 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
Sep 22 Python
Python实现括号匹配方法详解
Feb 10 Python
Python子进程subpocess原理及用法解析
Jul 16 Python
django下创建多个app并设置urls方法
Aug 02 Python
python 操作excel表格的方法
Dec 05 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
zf框架的校验器InArray使用示例
2014/03/13 PHP
javascript function、指针及内置对象
2009/02/19 Javascript
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
jQuery动态设置form表单的enctype值(实现代码)
2013/07/04 Javascript
使用jQuery插件创建常规模态窗口登陆效果
2013/08/23 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
2014/10/14 Javascript
Angularjs基础知识及示例汇总
2015/01/22 Javascript
轻量级javascript 框架Backbone使用指南
2015/07/24 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
Angular5中调用第三方库及jQuery的添加的方法
2018/06/07 jQuery
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
jquery实现简单自动轮播图效果
2020/07/29 jQuery
js实现3D旋转效果
2020/08/18 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
2016/04/20 Python
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
python中pip的安装与使用教程
2018/08/10 Python
Python Subprocess模块原理及实例
2019/08/26 Python
学python安装的软件总结
2019/10/12 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
2020/02/26 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
python matplotlib.pyplot.plot()参数用法
2020/04/14 Python
python利用pytesseract 实现本地识别图片文字
2020/12/14 Python
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
北美最大的参茸药食商城:德成行
2020/12/06 全球购物
如何安装ruby on rails
2014/02/09 面试题
交通事故协议书范文
2014/04/16 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
2015党建工作简报
2015/07/21 职场文书
详解CSS开发过程中的20个快速提升技巧
2021/05/21 HTML / CSS
Java异常处理try catch的基本用法
2021/12/06 Java/Android
win10壁纸在哪个文件夹 win10桌面背景图片文件位置分享
2022/08/05 数码科技