0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenCV中图像旋转函数操作原理及基本技巧

OpenCV学堂 来源:OpenCV学堂 2023-11-14 09:40 次阅读

01

引言

初学图像处理,很多人遇到的第一关就是图像旋转,图像旋转是图像几何变换中最具代表性的操作,包含了插值、背景处理、三角函数等相关知识,一个变换矩阵跟计算图像旋转之后的大小公式就让很多开发者最后直接调用函数了事,但是其实这个东西并没有这么难懂,可以说主要是之前别人写的公式太吓人,小编很久以前第一次接触的也是被吓晕了!所以决定从程序员可以接受的角度从新介绍一下图像旋转基本原理与OpenCV中图像旋转函数操作的基本技巧。

图像旋转基本原理

旋转涉及到两个问题,一个是图像旋转之后的大小会发生改变,会产生背景,通过背景填充方式都是填充黑色,此外旋转还是产生像素的位置迁移,新的位置像素需要通过插值计算获得,常见的插值方式有最近邻、线性插值、立方插值等。

首先看旋转之后的图像宽高变化,如下图所示:

c04e2600-828a-11ee-939d-92fbcf53809c.png

c05ca4f0-828a-11ee-939d-92fbcf53809c.png

这个是正常的平面坐标系中的旋转矩阵,可以简写为:

c06ca1a2-828a-11ee-939d-92fbcf53809c.png

是一个2x3的矩阵,但是在图像中左上角是原点,要实现围绕图像的中心位置旋转,M就要重新计算,所以OpenCV中的图像旋转矩阵为:

c079f762-828a-11ee-939d-92fbcf53809c.png

其中scale是表示矩阵支持旋转+放缩,这里可以把Scale=1。第三列是图像旋转之后中心位置平移量。

函数支持

OpenCV中支持图像旋转的函数有两个,一个是直接支持旋转的函数,但是它支持的是90,180,270这样的特殊角度旋转。

void cv::rotate   (
    InputArray    src,
    OutputArray dst,
    int rotateCode
)

其中rotateCode参数必须为:

ROTATE_180,
ROTATE_90_CLOCKWISE
ROTATE_90_COUNTERCLOCKWISE

函数warpAffine支持任意角度的旋转,通过定义M矩阵实现

void cv::warpAffine(
         InputArray      src, // 输入图像
         OutputArray dst, // 输出图像
         InputArray      M, // 旋转矩阵
         Size         dsize, // 输出图像大小
         int   flags = INTER_LINEAR, // 像素插值方式
         int   borderMode = BORDER_CONSTANT, // 背景填充默认为常量
         const Scalar &        borderValue = Scalar() // 填充颜色默认为黑色
)

但是M如何生成与获取,OpenCV中提供了一个函数根据输入的参数自动生成旋转矩阵M,该函数为

Mat cv::getRotationMatrix2D(
         Point2f   center,
         double    angle,
         double    scale
)

代码演示

使用自定义的M矩阵实现图像旋转


h,w,c=src.shape
#定义矩阵
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
#执行旋转
dst=cv.warpAffine(src,M,(w,h))
cv.imshow("rotate-center-demo",dst)

重新计算旋转之后的图像大小,实现无Crop版本的图像旋转

h,w,c=src.shape
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

#changewithfullsize
bound_w=int(h*np.abs(beta)+w*np.abs(alpha))
bound_h=int(h*np.abs(alpha)+w*np.abs(beta))

#添加中心位置迁移
M[0,2]+=bound_w/2-cx
M[1,2]+=bound_h/2-cy
dst=cv.warpAffine(src,M,(bound_w,bound_h))
cv.imshow("rotatewithoutcropping",dst)

背景随便变化+无Crop版本的图像旋转动态演示

degree=1.0
d1=np.pi/180.0
whileTrue:
alpha=np.cos(d1*degree)
beta=np.sin(d1*degree)
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

#changewithfullsize
bound_w=int(h*np.abs(beta)+w*np.abs(alpha))
bound_h=int(h*np.abs(alpha)+w*np.abs(beta))
M[0,2]+=bound_w/2-cx
M[1,2]+=bound_h/2-cy
red=np.random.randint(0,255)
green=np.random.randint(0,255)
blue=np.random.randint(0,255)
dst=cv.warpAffine(src,M,(bound_w,bound_h),borderMode=cv.BORDER_CONSTANT,borderValue=(blue,green,red))
cv.imshow("rotate+background",dst)
c=cv.waitKey(1000)
ifc==27:
break
degree+=1
print("degree",degree)
ifdegree>360:
degree=degree%360

编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4329

    浏览量

    62587
  • OpenCV
    +关注

    关注

    31

    文章

    635

    浏览量

    41343

原文标题:经验 | OpenCV图像旋转的原理与技巧

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【Rayeager PX2分享】OpenCV入门之图像显示

    $@ -c $
    发表于 04-14 15:49

    Vivado HLS实现OpenCV图像处理的设计流程与分析

    本文通过对OpenCV图像类型和函数处理方法的介绍,通过设计实例描述在vivadoHLS调用Open
    发表于 07-08 08:30

    如何使用PythonOpenCV模块检测颜色

    numpy然后,导入模块。读取图像并使用 OpenCV 模块的 cvtColor() 函数将BGR图像转换为 HSV (色调、饱和度、值
    发表于 02-09 16:31

    OpenCV图像处理编程研究

    OpenCV是一种用于数字图像处理和计算机视觉的函数库,由Intel微处理器研究实验室的视觉交互组开发,采用的开发语言是C++。本文通过学习掌握在OpenCV下进行数字
    发表于 06-25 17:52 0次下载

    基于OpenCV图像特征智能识别系统设计

    ,通过OpenCV的相关函数进行特征图像的识别。针对食品药品加工过程的特定问题进行模拟,实验表明,该系统具有较好的识别速度和识别效率,具有一定的实用性。
    发表于 12-31 09:20 20次下载

    opencv如何实现图像旋转_原理是什么

    旋转一般是指将图像围绕某一指定点旋转一定的角度,图像旋转后会有一部分图像转出显示区域,可以截图那
    发表于 12-04 16:40 2.8w次阅读
    <b class='flag-5'>opencv</b>如何实现<b class='flag-5'>图像</b><b class='flag-5'>旋转</b>_原理是什么

    OpenCV函数图像处理目录说明

    本文档的主要内容详细介绍的是OpenCV函数图像处理目录说明。
    发表于 10-29 15:55 12次下载
    <b class='flag-5'>OpenCV</b><b class='flag-5'>函数</b><b class='flag-5'>图像</b>处理目录说明

    如何使用OpenCV访问Mat图像每个像素的值

    本文档的主要内容详细介绍的是如何使用OpenCV访问Mat图像每个像素的值
    发表于 11-26 16:13 4次下载

    OpenCV的基本操作

    今天这一篇文章主要记录一下OpenCV中一些基本的操作,包括读取图片,视频以及反转图像的几种操作: 一:图片的载入 图片载入很常用,很实用。。。 二:读取视频 读取视频分为从摄像头中读
    的头像 发表于 11-02 15:04 1929次阅读
    <b class='flag-5'>OpenCV</b>的基本<b class='flag-5'>操作</b>

    OpenCV色彩空间的转换函数

    在这一篇文章,我们将会学习使用一下OpenCV色彩空间的转换函数,我们这里说的色彩空间是说的使用多种颜色(通常指三种以上),来表示颜色的方法,像是我们平时所说的RGB,HSV,YU
    的头像 发表于 11-02 15:23 2617次阅读

    OpenCV图像的计算

    今天我们一起学习的是OpenCV图像的计算,在图像计算,分为像素级运算和代数运算这两大类,今天我们借助
    的头像 发表于 11-03 17:45 2138次阅读

    OpenCV实现了图像形态学什么常见操作

    图像形态学是图像处理的分支学科,在二值图像处理占有重要地位、OpenCV实现了
    的头像 发表于 05-27 14:11 1458次阅读
    <b class='flag-5'>OpenCV</b><b class='flag-5'>中</b>实现了<b class='flag-5'>图像</b>形态学什么常见<b class='flag-5'>操作</b>?

    如何使用OpenCV和Python从图像中提取感兴趣区域

    今天我们将一起探究如何使用OpenCV和Python从图像中提取感兴趣区域(ROI)。 在之间的文章,我们完成了图像边缘提取,例如从台球桌中提取桌边。使用了简单的
    的头像 发表于 02-07 14:42 1844次阅读

    OpenCV库在图像处理和深度学习的应用

    本文深入浅出地探讨了OpenCV库在图像处理和深度学习的应用。从基本概念和操作,到复杂的图像变换和深度学习模型的使用,文章以详尽的代码和解
    的头像 发表于 08-18 11:33 886次阅读

    OpenCV图像识别C++代码

    的头文件 在您的C++代码,包含以下必要的头文件: # include # include # include # include # include # include # include 读取图像
    的头像 发表于 07-16 10:42 1985次阅读