Python OpenCV 图像平移的实现示例


Posted in Python onJune 04, 2021

每次学习新东西的时候,橡皮擦都是去海量检索,然后找到适合自己理解的部分。

再将其拼凑成一个小的系统,争取对该内容有初步理解。

今天这 1 个小时,核心要学习的是图像的平移,在电脑上随便打开一张图片,实现移动都非常简单,但是在代码中,出现了一些新的概念。

检索 OpenCV 图像平移相关资料时,碰到的第一个新概念是就是 仿射变换

每次看到这样子的数学名字,必然心中一凉,做为一个数学小白,又要瑟瑟发抖了。

百度一下,看看百科中是如何介绍的。

Python OpenCV 图像平移的实现示例

看过上图中的一些相关简介之后,对于这个概念也并没有太深刻的理解,本着先用起来,在补充理论的学习观点,我们先实现图像平移。

学习过程中,碰到一些概念性的东西,可以先应用起来,然后在后续的深入学习过程中,逐步去完善它们。

cv2.warpAffine() 仿射变换

基于该方法去寻找相关资料,得到仿射变换的基本概念,从二维坐标到二维坐标之间的线性变换,并且要保持二维图形的“平直性” 和 “平行性”。

仿射变换中,包含平移,缩放,翻转,旋转,剪切。

该方法的语法结构如下:

dst = cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

参数说明:

  • src:输入图像
  • M:2*3 transformation matrix (转变矩阵)
  • dsize:输出图像的大小,格式为(cols,rows),width 对应 cols,height 对应 rows
  • flags: 可选参数,插值方法的组合(int 类型),默认值 INTER_LINEAR
  • borderMode:可选参数,边界像素模式(int 类型),默认值 BORDER_CONSTANT
  • borderValue:可选参数,边界填充值; 默认情况下,默认值 Scalar()即 0

官方可查阅的英文资料如下:

Python OpenCV 图像平移的实现示例

插值方式(flags)有如下类型:

  • INTER_LINEAR 线性插值
  • INTER_NEAREST 最近邻插值
  • INTER_AREA 区域插值
  • INTER_CUBIC 三次样条插值
  • INTER_LANCZOS4 Lanczos 插值

一般情况下,使用 wrapAffine 前三个参数,即 warpAffine(img,M,(rows,cols)) 实现基本的仿射变换效果,但是这种情况会出现 黑边 现象。

最后一个参数为 borderValue,边界填充的颜色,默认为黑色,可以自行设置为其它颜色。

具体代码

图像平移是图像位置的移动。在平移前,需要先转换矩阵 M,,其中 txty 表示在(x,y)方向上的位移,如下所示:

Python OpenCV 图像平移的实现示例

测试代码如下,重要部分在注释中进行说明。

import numpy as np
import cv2 as cv

img = cv.imread('10.jpg', 1)
rows, cols, channels = img.shape
# [1,0,100] 右移 100, [0,1,50] 下移 50
M = np.float32([[1, 0, 100], [0, 1, 50]])
res = cv.warpAffine(img, M, (cols, rows))
cv.imshow("img", res)
cv.waitKey()

特别说明:
cv.warpAffine 方法的第三个参数是输出图像的大小,其形式应为(width,height)。记住 width =列数(cols),height =行数(rows)。

以下为代码运行结果。

Python OpenCV 图像平移的实现示例

关于 borderMode 参数值的说明:

该部分内容涉及边缘处理,翻阅手册过程找到的说明指向 BorderTypes。翻阅了一下,依旧是有些超纲,可以先记录下相关内容,日后在进行回顾,参考地址

所有值罗列如下:

  • BORDER_CONSTANT = 0
  • BORDER_REPLICATE = 1
  • BORDER_REFLECT = 2
  • BORDER_WRAP = 3
  • BORDER_REFLECT_101 = 4
  • BORDER_TRANSPARENT = 5
  • BORDER_REFLECT101 = BORDER_REFLECT_101
  • BORDER_DEFAULT = BORDER_REFLECT_101
  • BORDER_ISOLATED = 16

Python OpenCV 图像平移的实现示例

borderValue:当图像边界处理方式为 BORDER_CONSTANT 时的填充值。

测试代码如下:

import numpy as np
import cv2 as cv

img = cv.imread('10.jpg', 1)
rows, cols, channels = img.shape
M = np.float32([[1, 0, 100], [0, 1, 50]])
res = cv.warpAffine(img, M, (cols, rows),
                    borderMode=cv.BORDER_CONSTANT, borderValue=(200, 66, 66))
cv.imshow("img", res)
cv.waitKey()

OpenCV 尾声

到此这篇关于Python OpenCV 图像平移的实现示例的文章就介绍到这了,更多相关OpenCV 图像平移内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python控制台中实现进度条功能
Nov 10 Python
Python序列操作之进阶篇
Dec 08 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
Jul 13 Python
Django中的Model操作表的实现
Jul 24 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
Dec 10 Python
Python multiprocessing多进程原理与应用示例
Feb 28 Python
Django ORM 常用字段与不常用字段汇总
Aug 09 Python
postman传递当前时间戳实例详解
Sep 14 Python
Django框架之中间件MiddleWare的实现
Dec 30 Python
python实现简单的五子棋游戏
Sep 01 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
Dec 07 Python
解决pytorch 模型复制的一些问题
Mar 03 Python
Python包argparse模块常用方法
Jun 04 #Python
opencv读取视频并保存图像的方法
Python还能这么玩之用Python做个小游戏的外挂
Jun 04 #Python
python opencv旋转图片的使用方法
Python还能这么玩之用Python修改了班花的开机密码
Anaconda安装pytorch及配置PyCharm 2021环境
python如何利用cv2模块读取显示保存图片
Jun 04 #Python
You might like
php实现mysql数据库备份类
2008/03/20 PHP
javascript 内存回收机制理解
2011/01/17 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
js冒泡、捕获事件及阻止冒泡方法详细总结
2014/05/08 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
Three.js学习之网格
2016/08/10 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
JS中Array数组学习总结
2017/01/18 Javascript
Angular.js前台传list数组由后台spring MVC接收数组示例代码
2017/07/31 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
2017/08/14 Javascript
JS实现颜色的10进制转化成rgba格式的方法
2017/09/04 Javascript
jQuery实现火车票买票城市选择切换功能
2017/09/15 jQuery
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
Javascript实现一朵从含苞到绽放的玫瑰
2019/03/30 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
Python的gevent框架的入门教程
2015/04/29 Python
Python英文文本分词(无空格)模块wordninja的使用实例
2019/02/20 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
Rockport乐步美国官网:风靡美国的白宫鞋
2016/11/24 全球购物
Java里面如何创建一个内部类的实例
2015/01/19 面试题
九州传奇上机题
2014/07/10 面试题
一封普通求职者的求职信
2013/11/20 职场文书
敬老文明号事迹材料
2014/01/16 职场文书
材料加工工程求职信
2014/02/19 职场文书
信用社竞聘演讲稿
2014/05/16 职场文书
班训口号大全
2014/06/18 职场文书
离婚协议书的书写要求
2014/09/17 职场文书
给校长的一封检讨书
2014/09/20 职场文书
优秀班主任先进事迹材料
2014/12/16 职场文书
给校长的建议书范文
2015/09/14 职场文书
python 利用PyAutoGUI快速构建自动化操作脚本
2021/05/31 Python
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android