图像处理中的仿射变换

  1. 摘抄自https://zhuanlan.zhihu.com/p/80852438
  2. 摘抄自https://blog.csdn.net/weixin_51571728/article/details/124434728

一、概述

图像的几何变换主要包括:平移、缩放、旋转、仿射、透视等等。图像变换是建立在矩阵运算基础上的,通过矩阵运算可以很快的找到不同图像的对应关系。理解变换的原理需要理解变换的构造方法以及矩阵的运算方法。
图像的几何变换主要分为三类:刚性变换、仿射变换和透视变换,如下图:
在这里插入图片描述仿射变换是从一个二维坐标系变换到另一个二维坐标系,属于线性变换。通过已知3对坐标点可以求得变换矩阵。
透视变换是从一个二维坐标系变换到一个三维坐标系,属于非线性变换。通过已知4对坐标点可以求得变换矩阵。
二、图像基本变换
图像的几何变换包含很多变换,其中有一些基本变换,而仿射变换和透视变换就是对这些基本变换进行组合实现的。

基本变换具体包括:平移(Translation)、缩放(Scale)、旋转(Rotation)、翻转(Flip)和错切(Shear)。

a. 平移

在这里插入图片描述
在这里插入图片描述

b. 缩放

在这里插入图片描述

c. 旋转

在这里插入图片描述
在这里插入图片描述

d. 翻转
在这里插入图片描述
在这里插入图片描述

e. 错切

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

错切亦称为剪切或错位变换,包含水平错切和垂直错切,常用于产生弹性物体的变形处理。
在这里插入图片描述

二、利用opencv实现仿射变换

摘抄自https://blog.csdn.net/weixin_51571728/article/details/124434728

在OpenCV中仿射函数为cv2.warpAffine(),它通过一个变换矩阵(映射矩阵)M 实现变换,具体为:dst(𝑥, 𝑦) = src(𝑀11𝑥 + 𝑀12𝑦 + 𝑀13, 𝑀21𝑥 + 𝑀22𝑦 + 𝑀23)。如下图所示,通过一个变换矩阵M将原始图像O变换为仿射图像R。

在这里插入图片描述
仿射图像R=变换矩阵M × 原始图像O

利用仿射函数cv2.warpAffine()可以实现对图像的平移、旋转、翻转等操作,其函数的语法格式如下:dst = cv2.warpAffine( src, M, dsize[, flags[, borderMode[, borderValue]]] )

参数解析:
dst :仿射变换后输出的图像,该图像的类型与原始图像的类型相同,由dsize 决定它的的实际大小。
src :要进行仿射变换的原始图像。
M :一个 2×3 的变换矩阵。使用不同的变换矩阵可以实现不同的仿射变换。
dsize:输出图像的尺寸大小。
flags :插值方法,默认为 INTER_LINEAR。当该值为 WARP_INVERSE_MAP 时,意味着 M 是逆变换类型,实现从目标图像 dst 到原始图像 src 的逆变换

概述中给出的旋转矩阵是3x3的。opencv中的变换矩阵M为2*3,数学计算中的变换矩阵需要在最后一行下增加[0,0,1]

  1. 平移的变换矩阵
    M = np.float32([[1, 0, x], [0, 1, y]]) #转换矩阵M
  2. 以图像中心为圆点,逆时针旋转 60°,并将目标图像缩小为原始图像的 0.7 倍
    M = cv2.getRotationMatrix2D((width/2, height/2), 60, 0.7) #生成转换矩阵M
  3. 根据3个点的坐标,及其变换后的坐标,获取变换矩阵
p1=np.float32([[0,0],[cols-1,0],[0,rows-1]])
p2=np.float32([[0,rows*0.33],[cols*0.85,rows*0.25],[cols*0.15,rows*0.7]])
M=cv2.getAffineTransform(p1,p2) #转换矩阵 M
  1. 透视
    仿射变换可以将矩形映射为任意平行四边形,而透视变换可以将矩形映射为任意四边形。通过函数cv2.warpPerspective()可以实现透视变换,其语法为dst = cv2.warpPerspective( src, M, dsize[, flags[, borderMode[, borderValue]]] )

参数解析:
dst :透视处理后的输出图像,与原始图像具有相同的类型。dsize 决定输出图像的实际大小。
src:要进行透视变换的图像。
M :一个 3×3 的变换矩阵
dsize :输出图像的尺寸大小。
flags :插值方法,默认为 INTER_LINEAR。当该值为WARP_INVERSE_MAP 时,意味着 M 是逆变换类型,能实现从目标图像 dst 到原始图像 src 的逆变换
透视变换需要知道4个点的左边及其变换后的坐标

pts1 = np.float32([[150,50],[400,50],[60,450],[310,450]])
pts2 = np.float32([[50,50],[rows-50,50],[50,cols-50],[rows-50,cols-50]])
M=cv2.getPerspectiveTransform(pts1,pts2)    #转换矩阵M
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值