学习记录如何使用opencv实现对图像的旋转操作。
图像的旋转矩阵一般为:
但是单纯的这个矩阵是在原点处进行变换的,为了能够在任意位置进行旋转变换,opencv采用了另一种方式:
为了构造这个矩阵,opencv提供了一个函数:
M = cv2.getRotationMatrix2D(center, angle, scale)
此函数主要用于获得图像绕着某一点的旋转矩阵,这个函数需要三个参数,旋转中心,旋转角度,旋转后图像的缩放比例。返回一个2*3矩阵,主要用于cv2.warpAffine()仿射变换。
parameters | center:旋转中心坐标,是一个元组参数(col, row) angle:旋转角度,旋转方向,负号为逆时针,正号为顺时针 scale:旋转后图像相比原来的缩放比例,1为等比例缩放 |
returns | 获得一个旋转矩阵 |
栗子:
import cv2
import numpy as np
img = 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]]
'''
参考:
cv2.warpAffine()函数主要是利用变换矩阵M对图像进行如旋转、仿射、平移等变换,只需要我们提供一个2*3的变换矩阵M,就可以对图像进行变换。它一般是和cv2.getRotationMatrix2D和cv.GetAffineTransform两个函数在一起使用,这两个函数是用来获取变换矩阵M,这样就不需要我们自己设置M。
cv2.warpAffine(src, M, dsize, dst, flags, borderMode, borderValue) → dst
参数 | 含义 |
src | 输入图像,可以为单通道或彩色图像 |
M | 变换矩阵,一般反映平移或旋转的关系,为InputArray类型的2×3变换矩阵。 |
dsize | 输出图像的大小 |
dst | 仿射变换后的输出图像 |
flags | 插值方法的组合(int 类型),默认为 flags=cv2.INTER_LINEAR,表示线性插值 |
borderMode | 边界像素模式(int 类型) |
borderValue | 边界填充值; 默认情况下,它为0,也就是边界填充默认是黑色。 |
一般使用前三个参数,其中flags表示插值方式,有以下取值:
flags取值 | 含义 |
cv2.INTER_LINEAR | 线性插值(默认) |
cv2.INTER_NEAREST | 最近邻插值 |
cv2.INTER_AREA | 区域插值 |
cv2.INTER_CUBIC | 三次样条插值 |
cv2.INTER_LANCZOS4 | Lanczos插值 |
对于插值方式的具体实践,将在另一篇文章中介绍。
参考:
import cv2
import 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
# opencv实现图像旋转实例
import cv2
import random
import matplotlib.pylab as plt
# 定义旋转函数
def ImageRotate(image):
height, width = image.shape[:2] # 输入(H,W,C),取 H,W 的zhi
center = (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_rotation
image = cv2.imread('../DAVIS-2016/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: