使用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装饰器验证配置文件示例
Feb 24 Python
Python验证企业工商注册码
Oct 25 Python
bpython 功能强大的Python shell
Feb 16 Python
浅谈python中的实例方法、类方法和静态方法
Feb 17 Python
浅谈Python黑帽子取代netcat
Feb 10 Python
Python读取系统文件夹内所有文件并统计数量的方法
Oct 23 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
May 07 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
Aug 09 Python
Python下应用opencv 实现人脸检测功能
Oct 24 Python
基于python读取.mat文件并取出信息
Dec 16 Python
python实现层次聚类的方法
Nov 01 Python
Python实战实现爬取天气数据并完成可视化分析详解
Jun 16 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
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
与文件上传有关的php配置参数总结
2013/06/14 PHP
php从字符串创建函数的方法
2015/03/16 PHP
PHP连接access数据库
2015/03/27 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
ThinkPHP框架实现数据增删改
2017/05/07 PHP
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
JavaScript栏目列表隐藏/显示简单实现
2013/04/03 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
JavaScript基本的输出和嵌入式写法教程
2015/10/20 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
简单实现jQuery级联菜单
2017/01/09 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
ReactNative实现Toast的示例
2017/12/31 Javascript
vuejs前后端数据交互之从后端请求数据的实例
2018/08/11 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
jquery实现自定义树形表格的方法【自定义树形结构table】
2019/07/12 jQuery
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
JavaScript 如何计算文本的行数的实现
2020/09/14 Javascript
jQuery使用hide()、toggle()函数实现相机品牌展示隐藏功能
2021/01/29 jQuery
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
2018/06/13 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
Anaconda使用IDLE的实现示例
2020/09/23 Python
Gap工厂店:Gap Factory
2017/11/02 全球购物
党的群众路线教育实践活动总结
2014/10/30 职场文书
老公保证书
2015/01/17 职场文书
浅谈JS的原型和原型链
2021/06/04 Javascript
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android
TV动画《八十龟酱观察日记》第四季宣传PV公布
2022/04/06 日漫