python cv2 二维图像的仿射变换,透视投影变换-记录

cv2的几个图像变换函数:

仿射变换

warpAffine()

getAffineTransform()

旋转变换(虽然属于仿射变换,但cv2提供了单独函数)

getRotationMatrix2D()

roate()

透视投影变换

warpPerspective()

getPrespectiveTransform()

两种变换可用下图直观形象的表达出来:

python cv2 二维图像的仿射变换,透视投影变换-记录

上图来源:https://www.cnblogs.com/houkai/p/6660272.html

仿射变换在图形中的变换包括:平移、缩放、旋转、斜切及它们的组合形式。这些变换的特点是:平行关系和线段的长度比例保持不变。

在opencv里面用函数warpAffine()可以实现对图像的仿射变换

def warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None

参数说明,pycharm直接定位看解释就好了:

python cv2 二维图像的仿射变换,透视投影变换-记录

M变换矩阵如何求呢?提供如下函数

def getAffineTransform(src, dst): # real signature unknown; restored from __doc__
    """
    getAffineTransform(src, dst) -> retval
    .
    """
    pass

其中getAffineTransform函数的src参数保存了变换前的三个点(一般为图像的三个顶点),dst保存了变换后先要达到的效果的三个点(选中的三个顶点变换后的位置)如下图所示:

python cv2 二维图像的仿射变换,透视投影变换-记录

示例代码如下:

python cv2 二维图像的仿射变换,透视投影变换-记录

还有一些函数可以实现旋转

getRotationMatrix2D() 可以定义旋转中心和任意旋转角度

roate() 这个函数只能实现90度 180度等个别角度旋转,无法做任意角度旋转

 

投影变换对应的函数如下

getPrespectiveTransform()

warpPerspective()

投影变换对图像的4个点(不一定是顶点)进行任意拉伸,然后图像根据预定义的插值算法自适应的填充到拉伸后的不规则图形当中,变换前后4个点的位置相互对应。

变换函数的插值算法有线性插值和邻近值插值法

比如投影变换使用的案例代码如下

h, w = image.shape[:2]

A = cv2.getPerspectiveTransform(

np.array([[0, 0], [w, 0], [0, h], [w, h]], np.float32),

np.array([[w/2, 0], [w, 0], [0, h], [w, h/2.0]], np.float32))

image = cv2.warpPerspective(image, A, (w, h))

#A = cv2.getRotationMatrix2D((w/2, h/2), 30, 1)
#image_b = cv2.warpAffine(image_b, A, (w, h))

透视投影后的效果,可以参考如下:

python cv2 二维图像的仿射变换,透视投影变换-记录