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发送arp欺骗攻击代码分析
Jan 16 Python
python单线程实现多个定时器示例
Mar 30 Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 Python
Python/Django后端使用PIL Image生成头像缩略图
Apr 30 Python
对python特殊函数 __call__()的使用详解
Jul 02 Python
python numpy中cumsum的用法详解
Oct 17 Python
利用matplotlib实现根据实时数据动态更新图形
Dec 13 Python
pyqt5数据库使用详细教程(打包解决方案)
Mar 25 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
Aug 07 Python
selenium+超级鹰实现模拟登录12306
Jan 24 Python
2021年值得向Python开发者推荐的VS Code扩展插件
Jan 25 Python
Python中的socket网络模块介绍
Jul 23 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中截取字符串支持utf-8
2007/01/18 PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
2012/06/05 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
利用XMLHTTP传递参数在另一页面执行并刷新本页
2006/10/26 Javascript
javaScript对象和属性的创建方法
2007/01/15 Javascript
北京奥运官方网站幻灯切换效果flash版打包下载
2008/01/30 Javascript
基于jquery的滚动鼠标放大缩小图片效果
2011/10/27 Javascript
jquery判断单选按钮radio是否选中的方法
2015/05/05 Javascript
jQuery实现简洁的轮播图效果实例
2016/09/07 Javascript
聊一聊JS中的prototype
2016/09/29 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
ES6解构赋值的功能与用途实例分析
2017/10/31 Javascript
微信小程序获取音频时长与实时获取播放进度问题
2018/08/28 Javascript
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
vue 弹出遮罩层样式实例
2020/07/22 Javascript
Javascript表单序列化原理及实现代码详解
2020/10/30 Javascript
js基于canvas实现时钟组件
2021/02/07 Javascript
对numpy中shape的深入理解
2018/06/15 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
俄罗斯园林植物网上商店:Garshinka
2020/07/16 全球购物
static全局变量与普通的全局变量有什么区别
2014/05/27 面试题
数字天堂软件测试面试题
2012/12/23 面试题
主要的Ajax框架都有什么
2013/11/14 面试题
列车长先进事迹材料
2014/01/25 职场文书
境外导游求职信
2014/02/27 职场文书
中介公司区域经理岗位职责范本
2014/03/02 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
同事打架检讨书
2015/05/06 职场文书
幼儿园新学期开学寄语
2015/05/27 职场文书
党组织关系的介绍信模板
2019/06/21 职场文书
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang
mybatis中sql语句CDATA标签的用法说明
2021/06/30 Java/Android