python 图像扭曲 opencv仿射变换 cv2.getAffineTransform() cv2.warpAffine()应用实例

目前要做数学公式图像数据增强,然后需要做图像扭曲,查阅opencv的相关资料记录一下自己的应用例子。

图像扭曲就是在图像上应用仿射变换,然后我用的方法是用python OpenCV,主要用到 cv2.getAffineTransform(),cv2.warpAffine()这两个函数。以下是我的代码示例

import cv2
import numpy as np

def AffineTrans(img):
    rows, cols = img.shape
    pts1 = np.float32([[20, 20], [30, 20], [20, 0]])  # 源图像中的三角形顶点坐标
    pts2 = np.float32([[20, 20], [30, 20], [25, 0]])  # 目标图像中的三角形顶点坐标
    M = cv2.getAffineTransform(pts1, pts2)  # 计算出仿射变换矩阵
    dst = cv2.warpAffine(img, M, (cols, rows))  # 应用仿射变换
    return dst

if __name__ == '__main__':
    img = cv2.imread(ImageName)
    affine_img = AffineTrans(img)

仿射变换的原理就是根据源图像中一个三角形的顶点坐标和应用仿射变换之后的目标图像中一个三角形的顶点坐标计算出一个变换矩阵,然后将这个矩阵应用到整个源图像。网上有很多介绍的帖子我就不多说了,只说说这个代码具体参数设置原理。

pts1 = np.float32([[20, 20], [30, 20], [20, 0]])
pts2 = np.float32([[20, 20], [30, 20], [25, 0]])

上面这两行代码就是设置的源图像(pts1)和目标图像(pts2)的顶点坐标(这个可以根据自己的数据自行设置,因为我的图像较小所以我的坐标设置的小),意思就是我们要将原图中的三角形坐标通过一个变换矩阵转换成目标图像中的坐标,如下所示:

python 图像扭曲 opencv仿射变换 cv2.getAffineTransform() cv2.warpAffine()应用实例_第1张图片

红色是原图中的三角形,绿色是应用仿射变换之后的目标图像的三角形,根据这个设置应用仿射变换之后图像应该像左边扭曲,有了这两个三角形的顶点坐标cv2.getAffineTransform()函数就能计算得到一个仿射变换矩阵,然后利用cv2.warpAffine()在原图应用仿射变换就得到了扭曲之后的图像。以下是上面代码运行结果实例(左边是原图,右边是应用仿射变换之后的图,可以看到图像是向左边倾斜了):

python 图像扭曲 opencv仿射变换 cv2.getAffineTransform() cv2.warpAffine()应用实例_第2张图片

 

你可能感兴趣的:(图像处理)