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下载Bing图片(代码)
Nov 07 Python
python基础教程之数字处理(math)模块详解
Mar 25 Python
Python-OpenCV基本操作方法详解
Apr 02 Python
wxPython的安装与使用教程
Aug 31 Python
python实现电子产品商店
Feb 26 Python
Python装饰器限制函数运行时间超时则退出执行
Apr 09 Python
python和c语言的主要区别总结
Jul 07 Python
python实现读取excel文件中所有sheet操作示例
Aug 09 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
Oct 14 Python
python 上下文管理器及自定义原理解析
Nov 19 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
Jun 23 Python
聊聊python中的异常嵌套
Sep 01 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 缓存函数代码
2008/08/27 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
2010/09/10 PHP
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
PHP面向对象程序设计之类与反射API详解
2016/12/02 PHP
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
2017/05/09 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
PHP7实现和CryptoJS的AES加密方式互通示例【AES-128-ECB加密】
2019/06/08 PHP
thinkPHP事务操作简单案例分析
2019/10/17 PHP
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
2009/12/09 Javascript
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2014/01/09 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
2014/04/10 Javascript
jQuery实现拖拽效果插件的方法
2015/03/23 Javascript
解析NodeJs的调试方法
2016/12/11 NodeJs
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
2017/03/23 jQuery
Vue.js tab实现选项卡切换
2017/05/16 Javascript
关于Stream和Buffer的相互转换详解
2017/07/26 Javascript
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
js实现动态增加文件域表单功能
2018/10/22 Javascript
vue中英文切换实例代码
2020/01/21 Javascript
python交互式图形编程实例(二)
2017/11/17 Python
Python Scapy随心所欲研究TCP协议栈
2018/11/20 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
python列表推导式入门学习解析
2019/12/02 Python
Python run()函数和start()函数的比较和差别介绍
2020/05/03 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
新手学python应该下哪个版本
2020/06/11 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
爱心募捐感谢信
2015/01/22 职场文书
异地恋情人节寄语
2015/02/28 职场文书
2016年乡镇综治宣传月活动总结
2016/03/16 职场文书
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL
解决redis批量删除key值的问题
2022/03/23 Redis
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers