使用OpenCV实现仿射变换—平移功能

作者:caimouse 时间:2022-11-01 01:45:06 

当我们打开一个图片编辑软件时,基本上都会提供几个操作:平移、缩放和旋转。特别目前在手机里拍照时,由于位置传感器的失灵,也许是软件的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实现仿射变换—平移功能,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

来源:https://blog.csdn.net/caimouse/article/details/100098416

标签:python,OpenCV,仿射变换,平移
0
投稿

猜你喜欢

  • Pycharm sqllite连接使用教程

    2021-01-06 00:21:06
  • sqlserver数据库主键的生成方式小结(sqlserver,mysql)

    2024-01-20 07:49:23
  • Python 匹配任意字符(包括换行符)的正则表达式写法

    2023-01-23 23:11:09
  • Python文件操作类操作实例详解

    2023-05-19 04:45:08
  • Python新手学习标准库模块命名

    2021-01-16 05:18:06
  • 详解PHP中的mb_detect_encoding函数使用方法

    2023-11-14 19:48:45
  • Node.js对MySQL数据库的增删改查实战记录

    2024-01-14 18:25:12
  • Python应用实现双指数函数及拟合代码实例

    2023-04-14 18:17:14
  • python实现下载指定网址所有图片的方法

    2021-05-17 22:12:16
  • python和node.js生成当前时间戳的示例

    2022-05-26 05:07:43
  • 解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    2024-01-26 03:05:05
  • pandas DataFrame 根据多列的值做判断,生成新的列值实例

    2023-11-11 01:48:11
  • 简单了解SQL常用删除语句原理区别

    2024-01-14 22:38:57
  • python绘制已知点的坐标的直线实例

    2023-03-12 08:36:11
  • SQL Server取得网站路径的几种方法及比较

    2008-12-09 14:15:00
  • python实现LBP方法提取图像纹理特征实现分类的步骤

    2023-05-24 02:12:27
  • 对MySQL慢查询日志进行分析的基本教程

    2024-01-22 20:32:35
  • 禁止背景图在网页中平铺

    2011-04-29 14:10:00
  • 浅析python 通⽤爬⾍和聚焦爬⾍

    2021-06-13 00:14:23
  • Pipenv一键搭建python虚拟环境的方法

    2022-07-15 03:49:41
  • asp之家 网络编程 m.aspxhome.com