使用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 爬虫的工具列表大全
Jan 31 Python
总结网络IO模型与select模型的Python实例讲解
Jun 27 Python
Python3.6正式版新特性预览
Dec 15 Python
Django model反向关联名称的方法
Dec 15 Python
Python Pandas实现数据分组求平均值并填充nan的示例
Jul 04 Python
Python获取好友地区分布及好友性别分布情况代码详解
Jul 10 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
深入了解Python 方法之类方法 & 静态方法
Aug 17 Python
10个python爬虫入门实例(小结)
Nov 01 Python
python 如何停止一个死循环的线程
Nov 24 Python
Pandas数据类型之category的用法
Jun 28 Python
Python+Pillow+Pytesseract实现验证码识别
May 11 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
收音机的保养
2021/03/01 无线电
PHP编程网上资源导航
2006/10/09 PHP
深入解析php中的foreach问题
2013/06/30 PHP
php网站地图生成类示例
2014/01/13 PHP
PHP检测字符串是否为UTF8编码的常用方法
2014/11/21 PHP
CodeIgniter配置之routes.php用法实例分析
2016/01/19 PHP
PHP登录验证码的实现与使用方法
2016/07/07 PHP
Laravel框架集合用法实例浅析
2020/05/14 PHP
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
2015/12/08 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
2016/11/28 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
2017/08/16 Javascript
ES6中的Promise代码详解
2017/10/09 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
Vue中computed、methods与watch的区别总结
2019/04/10 Javascript
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
JS设置自定义快捷键并实现图片上下左右移动
2019/10/17 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
2019/10/28 Javascript
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
2015/10/13 Python
Django接受前端数据的几种方法总结
2016/11/04 Python
python之PyMongo使用总结
2017/05/26 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
PHP实现发送和接收JSON请求
2018/06/07 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
python3实现小球转动抽奖小游戏
2020/04/15 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
2019/05/16 Python
加拿大高尔夫超市:Golf Town
2018/01/12 全球购物
养生餐厅创业计划书范文
2014/03/26 职场文书
2014年小学图书室工作总结
2014/12/09 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
人为什么会“幸灾乐祸”?
2019/08/06 职场文书
Python利用folium实现地图可视化
2021/05/23 Python
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
2022/04/07 Servers