OpenCV-Python图像的缩放、翻转和旋转

图像的缩放

opencv中对图像进行放缩有两种方式可以实现,一种是使用指定尺寸放缩;一种是使用缩放比例放缩。

  • 指定尺寸
    cv2.resize(image, (1920, 1080),直接指定放缩后的尺寸大小。

  • 缩放比例
    cv2.resize(image, (0,0), fx=2.0, fy=2.0,使用放缩比例放缩图片。

此外,根据resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)函数的参数可知,还可以选择插值函数的类型。根据官方说明:缩小图像时,使用cv2.INTER_AREA插值函数效果好;放大图像时,使用cv2.INTER_CUBICcv2.INTER_LINEAR都行,但后者速度更快。

代码示例:

# -*-coding:utf-8-*-
"""
File Name: image_operation.py
Program IDE: PyCharm
Date: 16:24
Create File By Author: Hong
"""
import cv2 as cv
import numpy as np


def resize_image(image_path: str):
    img = cv.imread(image_path, cv.IMREAD_COLOR)
    cv.imshow('input', img)
    h, w, c = img.shape
    # 图片放缩, 指定尺寸
    # dst = cv.resize(img, (w * 2, h * 2), interpolation=cv.INTER_CUBIC)
    shrink = cv.resize(img, (w // 2, h // 2), interpolation=cv.INTER_AREA)
    # 缩放比例
    # dst = cv.resize(img, (0, 0), fx=0.75, fy=0.75, interpolation=cv.INTER_CUBIC)
    enlarge = cv.resize(img, (0, 0), fx=2.0, fy=2.0, interpolation=cv.INTER_CUBIC)

    cv.imshow('shrink', shrink)
    cv.imshow('enlarge', enlarge)

    cv.waitKey(0)
    cv.destroyAllWindows()


if __name__ == '__main__':
    path = 'images/daiyutong.png'
    resize_image(path)

结果展示:

图像的放缩

图像的翻转

opencv翻转图像有三种方式,分别时上下翻转、左右翻转和对角线翻转,相对来说比较简单。

话不多说,直接上代码:

# -*-coding:utf-8-*-
"""
File Name: image_operation.py
Program IDE: PyCharm
Date: 16:24
Create File By Author: Hong
"""
import cv2 as cv
import numpy as np


def flip_image(image_path: str):
    img = cv.imread(image_path, cv.IMREAD_COLOR)
    cv.imshow('input', img)
    # 上下翻转
    dst1 = cv.flip(img, 0)
    res1 = np.vstack((img, dst1))
    # 左右翻转
    dst2 = cv.flip(img, 1)
    res2 = np.vstack((img, dst2))
    # 对角线翻转
    dst3 = cv.flip(img, -1)
    res3 = np.vstack((img, dst3))
    
    # 所有翻转结果在同一个窗口中显示
    result = np.hstack((res1, res2, res3))
    cv.imshow('flip', result)
    cv.imwrite('images/result_flip.jpg', result)

    cv.waitKey(0)
    cv.destroyAllWindows()


if __name__ == '__main__':
    path = 'images/daiyutong.png'
    flip_image(path)

结果展示:

图像的翻转

图像的旋转

opencv中的图像旋转,指的是图像绕着中心点旋转任意角度之后得到新的图像。其中有两种旋转方式。

  1. 特定角度旋转函数。但只支持90、180、270这样特殊的角度旋转:
    dst1 = cv.rotate(img, cv.ROTATE_90_CLOCKWISE)顺时针90度旋转
    dst2 = cv.rotate(img, cv.ROTATE_180)顺时针180度旋转
    dst3 = cv.rotate(img, cv.ROTATE_90_COUNTERCLOCKWISE)顺时针270度旋转

  2. 旋转任意角度。需要用到旋转矩阵M,有两种方法获取旋转矩阵M:手动配置(此方法可以实现没有裁剪后的旋转图像)和内置函数获取。
    cv2.warpAffine(img, M, (w, h)): 任意角度旋转函数,参数分别是需要旋转的图像,旋转矩阵M,旋转后的图像size。此函数返回旋转后的图像。

具体实现代码:

# -*-coding:utf-8-*-
"""
File Name: image_operation.py
Program IDE: PyCharm
Date: 16:24
Create File By Author: Hong
"""
import cv2 as cv
import numpy as np


def rotate_image(image_path: str):
    """
    旋转图像,介绍两种旋转方式。
    1、特定角度旋转函数,但是只支持90、180、270这样特殊的角度旋转。
    2、任意角度旋转函数,需要旋转矩阵M,有两种获取旋转矩阵M的方式:手动配置(可以实现没有裁剪后的旋转图像)和内置函数获取
    :param image_path: 传入的图像文件
    :return: 没有返回值
    """
    img = cv.imread(image_path, cv.IMREAD_COLOR)
    cv.imshow('input', img)

    h, w, c = img.shape

    # ###以下旋转方式获取的都是裁剪后的旋转图像#######
    # ##########手动设置旋转矩阵M#################
    # 定义空矩阵
    M = np.zeros((2, 3), dtype=np.float32)

    # 设定旋转角度
    alpha = np.cos(np.pi / 4.0)
    beta = np.sin(np.pi / 4.0)
    print('alpha: ', alpha)
    # 初始化旋转矩阵
    M[0, 0] = alpha
    M[1, 1] = alpha
    M[0, 1] = beta
    M[1, 0] = -beta

    # 图片中心点坐标
    cx = w / 2
    cy = h / 2

    # 变化的宽高
    tx = (1 - alpha) * cx - beta * cy
    ty = beta * cx + (1 - alpha) * cy

    M[0, 2] = tx
    M[1, 2] = ty

    # 内置函数获取旋转矩阵M,正值表示逆时针旋转,假设左上角是坐标原点
    M = cv.getRotationMatrix2D((w / 2, h / 2), 45, 1)
    # 执行旋转, 任意角度旋转
    result = cv.warpAffine(img, M, (w, h))

    # #######内置旋转函数,仅支持90,180,270#################
    dst1 = cv.rotate(img, cv.ROTATE_90_CLOCKWISE)
    dst2 = cv.rotate(img, cv.ROTATE_180)
    dst3 = cv.rotate(img, cv.ROTATE_90_COUNTERCLOCKWISE)

    # 将4张图像在一个窗口显示,注意:四张图像形状一致,否则会报错
    res = np.hstack((img, dst1, dst2, dst3))
    cv.imwrite('images/rotate4.jpg', res)
    cv.imshow('res', res)

    # 显示手动设置旋转角度的旋转图像结果
    result = np.hstack((img, result))
    cv.imwrite('images/rotate2.jpg', result)
    cv.imshow('rotate center', result)

    # # # #######获取没有裁剪的旋转图像#########
    # # 定义空矩阵
    # M = np.zeros((2, 3), dtype=np.float32)
    # # 设定旋转角度
    # alpha = np.cos(np.pi / 4.0)
    # beta = np.sin(np.pi / 4.0)
    # print('alpha: ', alpha)
    # # 初始化旋转矩阵
    # M[0, 0] = alpha
    # M[1, 1] = alpha
    # M[0, 1] = beta
    # M[1, 0] = -beta
    # # 图片中心点坐标
    # cx = w / 2
    # cy = h / 2
    #
    # # 变化的宽高
    # tx = (1 - alpha) * cx - beta * cy
    # ty = beta * cx + (1 - alpha) * cy
    # M[0, 2] = tx
    # M[1, 2] = ty
    #
    # # 旋转后的图像高、宽
    # rotated_w = int(h * np.abs(beta) + w * np.abs(alpha))
    # rotated_h = int(h * np.abs(alpha) + w * np.abs(beta))
    #
    # # 移动后的中心位置
    # M[0, 2] += rotated_w / 2 - cx
    # M[1, 2] += rotated_h / 2 - cy
    #
    # result = cv.warpAffine(img, M, (rotated_w, rotated_h))
    # cv.imshow('result', result)

    cv.waitKey(0)
    cv.destroyAllWindows()


if __name__ == '__main__':
    path = 'images/daiyutong.png'
    rotate_image(path)

效果展示:

任意角度旋转
特定角度旋转

更多计算机视觉内容,请关注微信公众号 “AI与计算机视觉”

  • 8
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Opencv-python图像变换是通过使用不同的变换矩阵来实现的。其中,平移是一种最简单的空间变换。使用Opencv的函数cv2.warpAffine()可以实现平移操作。在代码中,我们需要定义一个变换矩阵M,这个矩阵是一个2行3列的矩阵,决定了平移的方式。其中,M矩阵中的tx和ty分别表示在x和y方向上平移的距离。更具体地说,如果我们向右平移tx个像素,向下平移ty个像素,那么变换矩阵M的定义如下: import numpy as np rows, cols = img.shape[:2] M = np.float32([[1, 0, tx], [0, 1, ty]]) dst = cv2.warpAffine(img, M, (cols, rows)) 在上述代码中,我们使用了NumPy库来创建一个2x3的浮点型变换矩阵M,并将其传递给cv2.warpAffine()函数,该函数会将图像img按照定义的方式进行平移,并生成一个新的图像dst。最后,我们可以通过cv2.imshow()函数显示平移后的图像。 除了平移之外,Opencv还提供了其他的图像变换操作,比如可以按照指定的宽度和高度来调整图像的大小,也可以按照比例来进行。通过cv2.resize()函数可以实现操作。在代码中,我们可以使用下面的方式来进行操作: import cv2 img = cv2.imread('drawing.jpg') # 按照指定的宽度、高度图片 res = cv2.resize(img, (width, height)) # 按照比例图片 res2 = cv2.resize(img, None, fx=scale_x, fy=scale_y, interpolation=cv2.INTER_LINEAR) 在上面的代码中,我们首先使用cv2.imread()函数读取图像,并将其存储在变量img中。然后,我们可以使用cv2.resize()函数来调整图像的大小。其中,如果我们指定了宽度和高度,那么图像将按照这些指定的大小进行;如果我们指定了fx和fy的比例因子,那么图像将按照这些比例进行。最后,我们可以使用cv2.imshow()函数来显示后的图像。 总结起来,Opencv-python提供了多种图像变换操作,包括平移、等。通过使用相应的函数和变换矩阵,我们可以实现对图像的各种变换操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [opencv-python 详解图像的几何变换、平移、旋转翻转](https://blog.csdn.net/RayChiu757374816/article/details/120036004)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hong_Youth

您的鼓励将是我创作的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值