该系列文章为 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
平移的话就只能自己构造一个了。
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
注意,有时候我们在变换后的图像上完成了处理得到了特征点,现在需要获得对应的在原图上的坐标,这时候使用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
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
Perspective变换矫正后
TIPS:文中所有代码均在/Src/ImageProcessing/GeometricTransform