【opencv+python】图像处理之二、几何变换(仿射与投影)的应用

本文详细介绍如何使用OpenCV进行图像的几何变换操作,包括缩放、旋转和平移等基础变换,以及更复杂的仿射变换和投影变换,并提供具体实例代码。

该系列文章为 OpenCV+Python Tutorials的学习笔记
代码托管在Github
转载请注明: http://blog.csdn.net/a352611/article/details/51418178 [三记的博客]

写在文章开始之前:
关于几何变换,常见的资料都没有把数学原理部分讲透彻,基本都是照着课本说,导致我很多地方无法彻底理解.思前想后还是把这一块分成两个部分,一部分专门讲数学,一部分专门讲应用.本文为应用部分。


Geometry Transformation 几何变换

1.缩放 Scaling

cv2.resize实现对图片的缩放,可以指定需要的图片大小或缩放系数fx,fy

ResizeImg = cv2.resize(src=Img, dsize=(Img.shape[1]*2,\
              Img.shape[0]*2), interpolation=cv2.INTER_LINEAR)
 
  • 1
  • 2

或者

ResizeImg = cv2.resize(src=Img, fx=2, fy=2, \
              interpolation=cv2.INTER_LINEAR)
 
  • 1
  • 2

2.旋转、平移 Rotation,Translation

二者都只能通过cv2.warpAffine实现,旋转的话可以自己手写或者利用cv2.getRotationMatrix2D获得旋转矩阵。

RotateMatrix = cv2.getRotationMatrix2D(center=(Img.shape[1]/2, Img.shape[0]/2), angle=90, scale=1)
RotImg = cv2.warpAffine(Img, RotateMatrix, (Img.shape[0]*2, Img.shape[1]*2))
 
  • 1
  • 2

Lena RotaLena

平移的话就只能自己构造一个了。

TranslationMatrix = np.array([[1, 0, 100],
                              [0, 1,  50]], dtype=np.float32)
DstImg = cv2.warpAffine(Img, TranslationMatrix, (Img.shape[0]+200, Img.shape[1]+200), borderValue=(155, 155, 155))
 
  • 1
  • 2
  • 3

Translation
注意,有时候我们在变换后的图像上完成了处理得到了特征点,现在需要获得对应的在原图上的坐标,这时候使用cv2.invertAffineTransform可以得到变换矩阵的逆矩阵(也可以利用Numpy.linalg.inv求解,需要转homogeneous),将点左乘逆矩阵即可得到原图坐标。

3.仿射 Affine

对于仿射变换,我们只需要知道变换前的三个点与其对应的变换后的点,就可以通过cv2.getAffineTransform求得变换矩阵.

AffineMatrix = cv2.getAffineTransform(np.array(SrcPointsA),
                                      np.array(CanvasPointsA))
AffineImg = cv2.warpAffine(Img, AffineMatrix, (Img.shape[1], Img.shape[0]))
 
  • 1
  • 2
  • 3

AffineLena
Affine变换矫正后
InvAffine

4.投影 Projective

对于投影变换,我们则需要知道四个点,通过cv2.getPerspectiveTransform求得变换矩阵.之后使用cv2.warpPerspective获得矫正后的图片。

PerspectiveMatrix = cv2.getPerspectiveTransform(np.array(SrcPointsA), np.array(CanvasPointsA))
PerspectiveImg = cv2.warpPerspective(Img, PerspectiveMatrix, (300, 300))
 
  • 1
  • 2

Paper
Perspective变换矫正后
Perspective


TIPS:文中所有代码均在/Src/ImageProcessing/GeometricTransform


评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值