使用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 递归函数详解及实例
Dec 27 Python
Python使用defaultdict读取文件各列的方法
May 11 Python
Python生成8位随机字符串的方法分析
Dec 05 Python
Python设计模式之命令模式简单示例
Jan 10 Python
django 发送邮件和缓存的实现代码
Jul 18 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
python excel转换csv代码实例
Aug 26 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
Aug 30 Python
pandas-resample按时间聚合实例
Dec 27 Python
基于Python爬取fofa网页端数据过程解析
Jul 13 Python
如何让PyQt5中QWebEngineView与JavaScript交互
Oct 21 Python
python中super()函数的理解与基本使用
Aug 30 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
采用thinkphp自带方法生成静态html文件详解
2014/06/13 PHP
PHP实现在线阅读PDF文件的方法
2015/06/17 PHP
PHP实现的memcache环形队列类实例
2015/07/28 PHP
Thinkphp5框架ajax接口实现方法分析
2019/08/28 PHP
简洁Ajax函数处理(示例代码)
2013/11/15 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
jQuery的:parent选择器定义和用法
2014/07/01 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
浅析jquery数组删除指定元素的方法:grep()
2016/05/19 Javascript
Vuejs实现带样式的单文件组件新方法
2017/05/02 Javascript
BootStrap实现文件上传并带有进度条效果
2017/09/11 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
jQuery实现的简单歌词滚动功能示例
2019/01/07 jQuery
解决layer.open后laydate失效的问题
2019/09/06 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
Python配置文件解析模块ConfigParser使用实例
2015/04/13 Python
python监控文件并且发送告警邮件
2018/06/21 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
2019/11/15 Python
python内打印变量之%和f的实例
2020/02/19 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
pycharm 如何取消连按两下shift出现的全局搜索
2021/01/15 Python
HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
2013/01/30 HTML / CSS
您的时尚,您的生活方式:DTLR Villa
2019/12/25 全球购物
英语感恩演讲稿
2014/01/14 职场文书
大学生求职自我评价
2014/01/16 职场文书
房地产财务管理制度
2014/02/02 职场文书
教职工代表大会主持词
2014/04/01 职场文书
考生诚信考试承诺书
2014/05/23 职场文书
文秘应届生求职信
2014/07/05 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
【2·13】一图读懂中国无线电发展
2022/02/18 无线电