该系列文章为 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