OpenCV之图像旋转

举报
Y_K_C 发表于 2021/12/04 11:45:04 2021/12/04
【摘要】 声明:本文是OpenCV入门级别的技术分享,主要围绕图像预处理来进行学习,所用语言均为Python。

1.图像旋转

图像在OpenCV中为ndarray,由于其本身在数学上为矩阵,故旋转操作可通过矩阵乘法来实现,我们通过定义旋转矩阵可以实现图像的旋转,其公式如下:
image.png
由于通常情况下图片的旋转是围绕其左上角点旋转,故此公式只适用于绕图片左上角点旋转的情况下,OpenCV则是使用了另外一个可适用于绕任意一点旋转的公式,即:
image.png
其中第三列为旋转之后中心位置的平移量,scale表示矩阵支持在旋转的同时进行缩放,定位1时图像在旋转时大小不变。
旋转示意图:
image.png
image.png
OpenCV中提供了一个自动生成旋转矩阵的API(getRotationMatrix2D()),只要给定旋转的中心,角度和scale即可,再将所获得的矩阵与原图一起传入API(warpAffine()),指定输出大小即可,也可手动计算出旋转矩阵,具体如下:

import cv2 as cv
import numpy as np
path = "C:\\Users\\27914\\Desktop\\images\\test2.jpg"
image = cv.imread(path)
h,w,c = image.shape
M = np.zeros((2,3),dtype=np.float32)
#定义角度
alpha = np.cos(np.pi/6.0)
beta = np.sin(np.pi/6.0)
#旋转矩阵赋值
M[0,0] = alpha
M[0,1] = beta
M[1,0] = -beta
M[1,1] = alpha
#求原始中心位置
x = w/2
y = h/2
M[0,2] = (1-alpha)*x-beta*y
M[1,2] = (1-alpha)*y+beta*x
#旋转后完整展示的窗口大小
w_r = int(w*np.abs(alpha)+h*np.abs(beta))
h_r = int(h*np.abs(alpha)+w*np.abs(beta))
#加上中心偏移量
M[0,2]+=(w_r/2) - x
M[1,2]+=(h_r/2) - y
result = cv.warpAffine(image,M,(w_r,h_r))
cv.imshow("result",result)
cv.waitKey(0)
cv.destroyAllWindows()

旋转前:
image.png
旋转后:
image.png
自动生成旋转矩阵:

M = cv.getRotationMatrix2D((w/2,h/2),30.0,1)
result = cv.warpAffine(image,M,(w,h))
cv.imshow("result",result)
cv.waitKey(0)
cv.destroyAllWindows()

图像旋转同样可以扩充训练集的图片数量。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。