使用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的Tornado框架实现数据可视化的教程
May 02 Python
构建Python包的五个简单准则简介
Jun 15 Python
利用Python学习RabbitMQ消息队列
Nov 30 Python
python制作爬虫爬取京东商品评论教程
Dec 16 Python
使用python读取csv文件快速插入数据库的实例
Jun 21 Python
python中从str中提取元素到list以及将list转换为str的方法
Jun 26 Python
使用pandas实现csv/excel sheet互相转换的方法
Dec 10 Python
pycharm设置鼠标悬停查看方法设置
Jul 29 Python
python numpy之np.random的随机数函数使用介绍
Oct 06 Python
python将图片转base64,实现前端显示
Jan 09 Python
python 通过使用Yolact训练数据集
Apr 06 Python
Python内置包对JSON文件数据进行编码和解码
Apr 12 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
php adodb连接不同数据库
2009/03/19 PHP
php checkbox 取值详细说明
2010/08/19 PHP
Yii中CGridView关联表搜索排序方法实例详解
2014/12/03 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
PHP面向对象程序设计重载(overloading)操作详解
2019/06/13 PHP
csdn 博客中实现运行代码功能实现
2009/08/29 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
2011/06/08 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
JQuery实现列表中复选框全选反选功能封装(推荐)
2016/11/24 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
微信小程序实现美团菜单
2018/06/06 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
[02:42]决战东方!DOTA2亚洲邀请赛重启荣耀之争
2017/03/17 DOTA
python3.3实现乘法表示例
2014/02/07 Python
python打开文件并获取文件相关属性的方法
2015/04/23 Python
Python实现队列的方法
2015/05/26 Python
Python基于正则表达式实现文件内容替换的方法
2017/08/30 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
Python json解析库jsonpath原理及使用示例
2020/11/25 Python
TensorFlow2.0使用keras训练模型的实现
2021/02/20 Python
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
Smashbox官网:美国知名彩妆品牌
2017/01/05 全球购物
东方红海科技面试题软件测试方面
2012/02/08 面试题
信息专业个人的自我评价
2013/12/27 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
党校党性分析材料
2014/12/19 职场文书
2015年商场工作总结
2015/04/27 职场文书
六一儿童节致辞
2015/07/31 职场文书
小学生一年级(书信作文)
2019/08/13 职场文书