学习记录如何使用opencv实现对图像的旋转操作。
1cv2.getRotationMatrix2D(center, angle, scale)
图像的旋转矩阵一般为:
但是单纯的这个矩阵是在原点处进行变换的,为了能够在任意位置进行旋转变换,opencv采用了另一种方式:
为了构造这个矩阵,opencv提供了一个函数:
M = cv2.getRotationMatrix2D(center, angle, scale)
此函数主要用于获得图像绕着某一点的旋转矩阵,这个函数需要三个参数,旋转中心,旋转角度,旋转后图像的缩放比例。返回一个2*3矩阵,主要用于cv2.warpAffine()仿射变换。
栗子:
import cv2import numpy as npimg = cv2.imread('aier.jpg') # 读入图像,(H, W, C)rows,cols = img.shape[:2]# 取前两个值(H,W)# 第一个参数旋转中心,第二个参数旋转角度,第三个参数:缩放比例, 生成一2*3的矩阵center = (cols/2, rows/2) # 以图像中心为旋转中心angle = 90 # 顺时针旋转90°scale = 1 # 等比例旋转,即旋转后尺度不变 M = cv2.getRotationMatrix2D(center, angle, scale)print(M)'''[[ 6.123234e-17 1.000000e+00 1.500000e+02][-1.000000e+00 6.123234e-17 6.500000e+02]]'''
参考:
/weixin_36670529/article/details/89846039
2cv2.warpAffine(src, M, dsize, dst, flags, borderMode, borderValue)
cv2.warpAffine()函数主要是利用变换矩阵M对图像进行如旋转、仿射、平移等变换,只需要我们提供一个2*3的变换矩阵M,就可以对图像进行变换。它一般是和cv2.getRotationMatrix2D和cv.GetAffineTransform两个函数在一起使用,这两个函数是用来获取变换矩阵M,这样就不需要我们自己设置M。
cv2.warpAffine(src, M, dsize, dst, flags, borderMode, borderValue) → dst
一般使用前三个参数,其中flags表示插值方式,有以下取值:
对于插值方式的具体实践,将在另一篇文章中介绍。
参考:
/qq_39507748/article/details/104449245
3 图像旋转的通用写法
import cv2import random# 定义旋转函数def ImageRotate(image):height, width = image.shape[:2] # 输入(H,W,C),取 H,W 的值center = (width / 2, height / 2) # 绕图片中心进行旋转angle = random.randint(-180, 180) # 旋转方向取(-180,180)中的随机整数值,负为逆时针,正为顺势针scale = 0.8 # 将图像缩放为80%# 获得旋转矩阵M = cv2.getRotationMatrix2D(center, angle, scale)# 进行仿射变换,边界填充为255,即白色,默认为0,即黑色image_rotation = cv2.warpAffine(src=image, M=M, dsize=(height, width), borderValue=(255, 255, 255))return image_rotation
4 实例
# opencv实现图像旋转实例import cv2import randomimport matplotlib.pylab as plt# 定义旋转函数def ImageRotate(image):height, width = image.shape[:2] # 输入(H,W,C),取 H,W 的zhicenter = (width / 2, height / 2) # 绕图片中心进行旋转angle = random.randint(-180, 180) # 旋转方向取(-180,180)中的随机整数值,负为逆时针,正为顺势针scale = 0.8 # 将图像缩放为80%# 获得旋转矩阵M = cv2.getRotationMatrix2D(center, angle, scale)# 进行仿射变换,边界填充为255,即白色,默认为黑色image_rotation = cv2.warpAffine(src=image, M=M, dsize=(height, width), borderValue=(255, 255, 255))return image_rotationimage = cv2.imread('../DAVIS-/JPEGImages/1080p/blackswan/00004.jpg')image = cv2.resize(image, (224, 224))image_rotation = ImageRotate(image)plt.subplot(1, 2, 1)plt.imshow(image)plt.subplot(1, 2, 2)plt.imshow(image_rotation)plt.show()
result:
顺时针逆时针
如果觉得《Opencv:图像旋转 cv2.getRotationMatrix2D 和 cv2.warpAffine 函数》对你有帮助,请点赞、收藏,并留下你的观点哦!