美文网首页
OpenCV实现图像的几何变换

OpenCV实现图像的几何变换

作者: Python百事通 | 来源:发表于2021-12-15 15:08 被阅读0次

    图像的几何变换

    几何变换主要包括缩放、平移、旋转、仿射变换、透视变换和图像裁剪等。执行这些几何变换的两个关键函数是cv2.warpAffine()和cv2.warpPerspective()。

    cv2.warpAffine()函数使用以下2 x 3变换矩阵来变换源图像:

    cv2.warpPerspective()函数使用以下3 x 3变换矩阵变换源图像:

    接下来,我们将了解最常见的几何变换技术。

    1.缩放图像

    缩放图像时,可以直接使用缩放后图像尺寸调用cv2.resize():

    # 指定缩放后图像尺寸

    resized_image = cv2.resize(image, (width *2, height *2), interpolation=cv2.INTER_LINEAR)

    除了上述用法外,也可以同时提供缩放因子fx和fy值。例如,如果要将图像缩小 2 倍:

    # 使用缩放因子

    dst_image = cv2.resize(image,None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)

    如果要放大图像,最好的方法是使用cv2.INTER_CUBIC插值方法(较耗时)或cv2.INTER_LINEAR。如果要缩小图像,一般的方法是使用cv2.INTER_LINEAR。OpenCV提供的五种插值方法如下表所示:

    显示缩放后的图像:

    可以通过坐标系观察图片的缩放情况:

    2.平移图像

    为了平移对象,需要使用NumPy数组创建2 x 3变换矩阵,其中提供了x和y方向的平移距离(以像素为单位):

    M = np.float32([[1,0, x], [0,1, y]])

    其对应于以下变换矩阵:

    创建此矩阵后,调用cv2.warpAffine()函数:

    dst_image = cv2.warpAffine(image, M, (width, height))

    cv2.warpAffine()函数使用提供的 M 矩阵转换源图像。第三个参数 (width, height) 用于确定输出图像的大小。

    例如,如果图片要在 x 方向平移 200 个像素,在 y 方向移动 30 像素:

    平移也可以为负值,此时为反方向移动:

    M = np.float32([[1,0, -200], [0,1, -30]])

    dst_image_2 = cv2.warpAffine(image, M, (width, height))

    显示图片如下:

    3.旋转图像

    为了旋转图像,需要首先使用cv.getRotationMatrix2D()函数来构建2 x 3变换矩阵。该矩阵以所需的角度(以度为单位)旋转图像,其中正值表示逆时针旋转。旋转中心 (center) 和比例因子 (scale) 也可以调整,使用这些元素,以下方式计算变换矩阵:

    其中:

    以下示例构建 M 变换矩阵以相对于图像中心旋转 180 度,缩放因子为 1(不缩放)。之后,将这个 M 矩阵应用于图像,如下所示:

    height, width = image.shape[:2]

    M = cv2.getRotationMatrix2D((width /2.0, height /2.0),180,1)

    dst_image = cv2.warpAffine(image, M, (width, height))

    接下来使用不同的旋转中心进行旋转:

    M = cv2.getRotationMatrix2D((width/1.5, height/1.5),30,1)

    dst_image_2 = cv2.warpAffine(image, M, (width, height))

    显示旋转后的图像:

    4 图像的仿射变换

    在仿射变换中,首先需要使用cv2.getAffineTransform()函数来构建2 x 3变换矩阵,该矩阵将从输入图像和变换图像中的相应坐标中获得。最后,将 M 矩阵传递给cv2.warpAffine():

    仿射变换是保留点、直线和平面的变换。此外,平行线在此变换后将保持平行。但是,仿射变换不会同时保留像素点之间的距离和角度。

    可以通过以下图像观察仿射变换的结果:

    5 图像的透视变换

    为了进行透视变换,首先需要使用cv2.getPerspectiveTransform()函数创建3 x 3变换矩阵。该函数需要四对点(源图像和输出图像中四边形的坐标),函数会根据这些点计算透视变换矩阵。然后,将 M 矩阵传递给cv2.warpPerspective():

    透视变换效果如下所示:

    6 裁剪图像

    可以使用NumPy切片裁剪图像:

    dst_image = image[80:200,230:330]

    裁剪结果如下所示:

    作者:盼小辉丶

    链接:https://juejin.cn/post/7035931986191450119

    来源:稀土掘金

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    相关文章

      网友评论

          本文标题:OpenCV实现图像的几何变换

          本文链接:https://www.haomeiwen.com/subject/njrlfrtx.html