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搭建虚拟环境的配置方法
Feb 28 Python
python打包压缩、读取指定目录下的指定类型文件
Apr 12 Python
详解python单元测试框架unittest
Jul 02 Python
pycharm 取消默认的右击运行unittest的方法
Nov 29 Python
python中partial()基础用法说明
Dec 30 Python
Python实现查找数组中任意第k大的数字算法示例
Jan 23 Python
Django对数据库进行添加与更新的例子
Jul 12 Python
Python3 解决读取中文文件txt编码的问题
Dec 20 Python
Python json格式化打印实现过程解析
Jul 21 Python
安装不同版本的tensorflow与models方法实现
Feb 20 Python
Python Socket编程详解
Apr 25 Python
OpenCV 图像梯度的实现方法
Jul 25 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生成扭曲及旋转的验证码图片
2013/06/07 PHP
深入Memcache的Session数据的多服务器共享详解
2013/06/13 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
PHP删除字符串中非字母数字字符方法总结
2019/01/20 PHP
JS中eval函数的使用示例
2013/07/21 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
Jquery动态添加输入框的方法
2015/05/29 Javascript
Node.js Express 框架 POST方法详解
2017/01/23 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
2017/03/05 Javascript
webpack实现热更新(实施同步刷新)
2017/07/28 Javascript
layui框架中layer父子页面交互的方法分析
2017/11/15 Javascript
如何正确理解vue中的key详解
2019/11/02 Javascript
JavaScript This指向问题详解
2019/11/25 Javascript
详解Vue3中对VDOM的改进
2020/04/23 Javascript
详解JavaScript 作用域
2020/07/14 Javascript
react antd表格中渲染一张或多张图片的实例
2020/10/28 Javascript
JS数据类型分类及常用判断方法
2020/11/19 Javascript
对于Python中线程问题的简单讲解
2015/04/03 Python
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
Python2.7简单连接与操作MySQL的方法
2016/04/27 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
pandas条件组合筛选和按范围筛选的示例代码
2019/08/26 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
CSS3选择器新增问题的实现
2021/01/21 HTML / CSS
英国骑行、跑步、游泳、铁人三项运动装备专卖店:Wiggle
2016/08/23 全球购物
移动通信行业实习自我鉴定
2013/09/28 职场文书
浙大毕业生自荐信
2014/01/26 职场文书
音乐教学随笔感言
2014/02/19 职场文书
2014年创先争优活动总结
2014/05/04 职场文书
学校社会实践活动总结
2014/07/03 职场文书
老乡聚会通知
2015/04/23 职场文书
导游词之云南丽江-泸沽湖
2019/09/26 职场文书
python3中apply函数和lambda函数的使用详解
2022/02/28 Python
服务器SVN搭建图文安装过程
2022/06/21 Servers