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

举报
Hong_Youth 发表于 2023/04/29 09:06:06 2023/04/29
【摘要】 opencv中对图像进行放缩有两种方式可以实现,一种是使用指定尺寸放缩;一种是使用缩放比例放缩。

图像的缩放

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与计算机视觉”

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。