图像处理中的仿射变换和透视变换


前言

本篇文章主要用于记录图像处理中的仿射变换和透视变换原理和代码,以及在项目当中如何使用它们


一、仿射变换

1.1仿射变换原理

  • 仿射变换(Affine Transformation)其实是另外两个简单变换的叠加:一个是线性变换,一个是平移变换。
  • 仿射变换包括缩放(Scale),平移(transform),旋转(retate),反射(reflection),错切(shear mapping),原来的直线仿射变换后还是直线,原来的平行线经过仿射变换之后还是平行线,这就是仿射。

1.2数学表达

一个集合X的仿射变换为:
f ( x ) = A x + b , x ∈ X f(x) = Ax+b, x \in X f(x)=Ax+b,xX
仿射变换是二维平面中一种重要的变换,在图像图形领域有广泛的应用,在二维图像变换中,表达式为:
[ x ∗ y ∗ 1 ] = [ a b c d e f 0 0 1 ] [ x y 1 ] \left[ \begin{array}{ccc} x^{*} \\ y^{*} \\ 1 \end{array} \right] = \left[ \begin{array}{ccc} a & b & c \\ d & e & f \\ 0 & 0 & 1 \end{array} \right] \left[ \begin{array}{ccc} x \\ y \\ 1 \end{array} \right] xy1 = ad0be0cf1 xy1
实际上,计算这个矩阵的过程涉及到解一个线性方程组。对于给定的三组点,也就是三个坐标(上左,上右,下左变换前和变换后的坐标点),可以列出三个上方的表达式。

然后三个线性方程组,可以简化为六个线性方程(忽略最后一行,因为它总是成立),其中可以求解得出a,b,c,d,e,f,最后得出仿射变换矩阵。

最后调用对应的cv2当中的函数进行求出裁剪的区域。

1.3代码及示例

代码如下所示:

'''
这是先获取图像和右手的两个关节点左边。
然后计算两个关节点方向和垂直方向,获取需要裁剪的坐标中心点,
根据方向计算裁剪的四个坐标,计算仿射变换矩阵,最后调用cv2的
内置函数cv2.warpAffine(image,M,(width,height))获取需要
裁剪的图像。

'''
	picture1 = data['pictures'][0]
    frame1 = data['joints'][0]
    x1 = frame1[7]
    x2 = frame1[9]
    direction = [b-a for a,b in zip(x1,x2)]
    direction_unit = direction/np.linalg.norm(direction)
    width = 120
    height = 240
    # 垂直于方向向量的单位向量
    perpendicular_unit = np.array([direction_unit[1], -direction_unit[0]])/np.linalg.norm(direction_unit)
    x2 = x2+direction_unit*70
    # 计算裁剪区域的四个顶点,x2 为边中点
    top_left = x2 + direction_unit * width / 2 - perpendicular_unit * height / 2
    top_right = x2 - direction_unit * width / 2 - perpendicular_unit * height / 2
    bottom_left = x2 + direction_unit * width / 2 + perpendicular_unit * height / 2
    bottom_right = x2 - direction_unit * width / 2 + perpendicular_unit * height / 2
    # 原始图像 img
    pts1 = np.float32([top_left, top_right, bottom_left])
    pts2 = np.float32([[0, 0], [width, 0], [0, height]])
    # 获取仿射变换矩阵
    M = cv2.getAffineTransform(pts1, pts2)
    cropped_image = cv2.warpAffine(picture1,M,(width,height))

示例:
原始图像:
This is original image.
想要裁剪得到右手上面拿的旗子,并考虑旗子的翻转,裁剪出适合左右数据集的旗子。示例结果:
This is result.

二、透视变换

2.1透视变换原理

2.2数学表达

2.3代码及示例


总结

本文主要简单介绍了图像处理中的仿射变换和透视变换,以及如何使用裁剪出想要的区域。

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值