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_CUBIC
和cv2.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中的图像旋转,指的是图像绕着中心点旋转任意角度之后得到新的图像。其中有两种旋转方式。
特定角度旋转函数。但只支持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度旋转旋转任意角度。需要用到旋转矩阵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)
效果展示: