Opencv:图像旋转,cv2.getRotationMatrix2D 和 cv2.warpAffine 函数

学习记录如何使用opencv实现对图像的旋转操作。

1 cv2.getRotationMatrix2D(center, angle, scale)

图像的旋转矩阵一般为:

但是单纯的这个矩阵是在原点处进行变换的,为了能够在任意位置进行旋转变换,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]]
'''

参考:

2 cv2.warpAffine(src, M, dsize, dst, flags, borderMode, borderValue)

cv2.warpAffine()函数主要是利用变换矩阵M对图像进行如旋转、仿射、平移等变换,只需要我们提供一个2*3的变换矩阵M,就可以对图像进行变换。它一般是和cv2.getRotationMatrix2Dcv.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_LANCZOS4Lanczos插值

对于插值方式的具体实践,将在另一篇文章中介绍。

参考:

3 图像旋转的通用写法

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

4 实例

# 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:

  • 顺时针

  • 逆时针

 

 

 

 

 

 

 

 

 

 

  • 26
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值