浅谈仿射变换和透视变换的区别

从直观的角度看,仿射变换和透视变换的最大区别是:一个平行四边形,经过仿射变换后依然是平行四边形;而经过透视变换后只是一个四边形(不再平行了)。

仿射变换

在这里插入图片描述
仿射变换是把一个二维坐标系转换到另一个二维坐标系的过程,转换过程坐标点的相对位置和属性不发生变换,是一个线性变换,该过程只发生旋转和平移过程。因此,一个平行四边形经过仿射变换后还是一个平行四边形。
所以,仿射= 旋转 + 平移
仿射变换矩阵为:
在这里插入图片描述
其中,(x,y)是原图坐标,(x’,y’)是变换后的坐标;m11,m12,m21,m22为旋转量,m13,m23为平移量。所以仿射变换矩阵实际为2*3的矩阵,以上只是齐次性,为了方便简洁表达旋转和平移,因此,仿射变换为线性变换。

在opencv中,实现仿射变换的函数为:

  • warpAffine(src,dst,M,(cols,rows))
  • src:输入图像
  • dst:输出图像
  • M:2*3的仿射变换矩阵
  • (cols,rows):输出图像的行数和列数

以下用python编程语言,opencv函数库简单实现一下仿射变换,以下程序实现把一张图片顺时针旋转45°,向左平移200个像素点,向下平移30个像素点,该过程的仿射变换矩阵为:
在这里插入图片描述

import cv2 as cv
import numpy as np

src = cv.imread("Google.jpg")
rows,cols = src.shape[0:2]
M = np.array([[np.cos(np.pi/4),np.sin(-np.pi/4),500],[np.sin(np.pi/4),np.cos(np.pi/4),30]]) #顺时针旋转45度,向左平移200,向下平移30
dst = cv.warpAffine(src,M,(2*cols, 2*rows))#把输出图像的大小改为输入图像的两倍
cv.imshow("src",src)
cv.imshow("dst",dst)
cv.imwrite("affine.jpg", dst)
cv.waitKey(0)

输入图像src:
在这里插入图片描述
输出图片dst:
在这里插入图片描述

透视变换

在这里插入图片描述
透视变换是把一个图像投影到一个新的视平面的过程,该过程包括:把一个二维坐标系转换为三维坐标系,然后把三维坐标系投影到新的二维坐标系。该过程是一个非线性变换过程,因此,一个平行四边形经过透视变换后只得到四边形,但不平行。
透视变换矩阵为:
在这里插入图片描述
其中,(x,y)是原图坐标,(x’,y’)是变换后的坐标;m11,m12,m21,m22,m31,m32为旋转量,m13,m23,m33为平移量。因为透视变换是非线性的,所以不能齐次性表示;透视变换矩阵为3*3。

在opencv中,实现透视变换的函数为:

  • warpPerspective(src,dst,H,(cols,rows))
  • src:输入图像
  • dst:输出图像
  • H:3*3的仿射变换矩阵
  • (cols,rows):输出图像的行数和列数

程序实现跟仿射变换差不多,这里不再展示。

总结

仿射变换常用于旋转和平移等图像处理操作,原理较简单。而透视变换的实际应用较大,如视角纠正,全景拼接等。

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值