您的位置:首页 > 编程语言 > Python开发

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

2018-02-19 17:32 1166 查看
该系列文章为 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
[/code]

或者

ResizeImg = cv2.resize(src=Img, fx=2, fy=2, \
interpolation=cv2.INTER_LINEAR)
1
2
[/code]

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
[/code]





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

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
[/code]



注意,有时候我们在变换后的图像上完成了处理得到了特征点,现在需要获得对应的在原图上的坐标,这时候使用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
[/code]



Affine变换矫正后



4.投影 Projective

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

PerspectiveMatrix = cv2.getPerspectiveTransform(np.array(SrcPointsA), np.array(CanvasPointsA))
PerspectiveImg = cv2.warpPerspective(Img, PerspectiveMatrix, (300, 300))
1
2
[/code]



Perspective变换矫正后



TIPS:文中所有代码均在/Src/ImageProcessing/GeometricTransform
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: