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

重磅干货,第一时间送达

图像的缩放

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

  • 指定尺寸
    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.pyProgram IDE: PyCharmDate: 16:24Create File By Author: Hong'''import cv2 as cvimport 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)

效果展示:

(0)

相关推荐

  • Python+opencv 图像处理(五)

        灰度反转 "你说的黑是什么黑......"有一首歌的歌词是这样的. 在图像中,黑是什么? 很简单,就是0嘛. 因为在数字图像里,用0表示黑. 那么,"你说的白是什 ...

  • OpenCV探索之路(五):图片缩放和图像金字塔

    对图像进行缩放的最简单方法当然是调用resize函数啦! resize函数可以将源图像精确地转化为指定尺寸的目标图像. 要缩小图像,一般推荐使用CV_INETR_AREA来插值:若要放大图像,推荐使用 ...

  • python+opencv图像处理(十一)

    图像镜像 图像的镜像指的是将图像以某条线为中心进行镜像对换. 图像的镜像根据翻转的方向可分为水平镜像翻转.垂直镜像翻转和对角镜像翻转3种. 水平镜像翻转指的是将图像以y轴为中心进行左右镜像对换. 垂直 ...

  • 一个简单方法识别毛玻璃、高斯模糊

    作者:晟沚 前  言 本文主要推荐一种简单的方法识别带有毛玻璃.高斯模糊等效果的图片. 01 毛玻璃效果 毛玻璃效果的原理,即遍历每一个像素,随机选取这个像素周围的某一个像素,替换当前像素.可以使用o ...

  • python+opencv图像处理(八)

    无所谓,谁会爱上谁... 无所谓,不能天天更... 只要是,不要一直断... -----------------------------------我是可爱的分割线 图像平移的意思就是将图像沿着x轴. ...

  • python+opencv图像处理(二)

    python+opencv图像处理(二) ----图像变换 自然界中有很多的颜色,红红的花,绿绿的草,蓝蓝的天,白白的云,多姿多彩的世界,美轮美奂的图像. 通过手机,照相机就可以定格每一个美的瞬间. ...

  • python+opencv图像处理(四十四)

    童年记忆中的爆米花,小时候只在过年的时候才能吃到,现在偶尔能在路边看到有在爆的,看到了总忍不住想买,虽然味道没什么变化,只是再吃不出来以前的幸福了. 长大了......心也大了...... 可是,实力 ...

  • 这个操作可能不值钱,但却值得学习 | 【图片批量裁剪】

    前言 有一句叫:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已 这句话,在实际的应用中,让我体会很深,目前很多算法已经能到初步满足我们的需求,更多的时候是要花费大量的时间在处理数据上 ...

  • (9条消息) OCR预处理:矫正图片中的文本信息(opencv)

    (9条消息) OCR预处理:矫正图片中的文本信息(opencv)

  • python+opencv图像处理(四十三)

    Luplacian算子 1.Luplacian算子 可以用二阶导数可以用来检测边缘,拉普拉斯算子是线性二阶微分算子. 2.Luplacian算子实现 在 OpenCV 中, 可以用函数Laplacia ...

  • python+opencv图像处理(十)

    图像旋转 本篇主要利用opencv的转换函数warpAffine实现图像的平移和旋转. 1.图像旋转 图像旋转即是根据某个中心点进行旋转. 要进行旋转,要找到中心点,要知道旋转角度,opencv提供了 ...

  • python进阶—OpenCV之图像处理(一)

    文章目录 颜色空间转换 RGB色彩空间 HSV色彩空间 YUV色彩空间 简单的物体跟踪示例 HSV空间目标阈值选取 图像几何变换 图像的缩放 图像的位移 图像的旋转 图像的仿射 图像的投射 图像阈值( ...

  • 《计算机视觉》中的几何变换:Python示例的直观解释

    重磅干货,第一时间送达 图片由Payton Tuttle在Unsplash提供 几何变换是任何图像批量处理中最常见的变换操作之一.在今天的文章中,我们将讨论其中的三种变换:旋转.平移和缩放,然后仅仅使 ...

  • python+opencv图像处理(十二)

    图像仿射变换和透视变换 天晴了...... 1.仿射变换 图像的仿射变换就是图像的旋转加上拉升,说直白点,就是把矩形变成平行四边形. 要把矩形变成平行四边行,只需要拉伸其四个角点就行了,事实上,只需要 ...