新人学习opencv图像处理的笔记,三:c++操作简单图像旋转

新人学习opencv图像处理的笔记,三:c++操作简单图像旋转

这篇笔记我一直想写,也是笔者真正开始学习图像的操作功能的开始,但是确实是各种事情一堆,看着别人做图像识别很厉害,想着自己做一个,结果碰了一鼻子灰,又回来重头开始。

同样的,这篇笔记是笔者自己瞎琢磨的一些想法,一些基本原理希望可以帮到同样是入门的初学者。

原理:

众所周知,opencv存储图像是用 Mat 类型来实现的,而Mat又是个矩阵,所以当我们想对某个图像进行旋转时,我们需要考虑的时像素在旋转后放在哪个位置?

在这里插入图片描述

接下来,我简单介绍一下我的思路和草稿

在这里插入图片描述

如上图,左边是原图,右面是旋转后的图像 (这里使用的是正常的直角坐标系,运用到OpenCV时,需要自己修改一些细节) 。分别选取原来的原点O,x和y轴,新图像的原点O’,x’和y’轴。

一:背景框

当图像旋转角度 α 时,先不论新的像素点如何安放,我们需要先解决背景框的问题,即创建一个适合的Mat矩阵,能把旋转后的图像恰到好处的装进去。假设x是长cols,y是宽rows。

New.rows = Old.rows × Cosα + Old.cols × Sinα
New.rows = Old.rows × Sinα + Old.cols × Cosα

新的Mat大小就是背景框的大小。

二:像素放置

在这里插入图片描述

为简单起见,我们把新图的O和O’重合,得到上图所示。乍一看,从单纯的数值角度,好像操作起来很困难,那么我们可以试试向量的操作,对于每一个点(a,b),我们都可以看作是两个向量的组成 即:a(x,0) + b(0,y)。其中(x,0)和(0,y)是原图的连个基向量。

用向量来解释像素坐标,一切都清晰起来。因为旋转不涉及改变矩阵大小,所以旋转改变的不是系数 a和b 的值,而是基向量。假设新的基向量为(x1,y1)和(x2,y2),那么在系数ab的作用下,我们可以得到新的表达式:
注:这里的两对基向量都是平行于需旋转图像的长宽方向,而非背景框的长宽方向。

	a(x1,y1) + b(x2,y2) = NewPoint

如此一来,我们的目标就从寻找位置,变成了解出新的基向量的变换关系。
假设基向量长度为1,所以两个基向量为(Sinα,Cosα)和(Cosα,-Sinα)。我们需要的是新坐标(A,B)。
此时我们有的变量为:
①两个基向量为(Sinα,Cosα)和(Cosα,-Sinα)
②原坐标(a,b),及其表达式a(x,0) + b(0,y)
把公式

        a(x1,y1) + b(x2,y2) =(A,B)

代入数据,即可解出(a,b)和(A,B)的映射关系,然后通过映射找到原图中的像素,放入新的图像中。(别忘了,我们还有个竖直坐标没有处理)。

当然,也不是就这么结束了,矩阵的坐标都是整数形式存在,而通过得到的映射,可能会解出浮点数,因此我们需要有选择的放入像素。笔者的方法是,从新图中的坐标映射到原图坐标。

得到的原图坐标分为小数Nx,Ny 和整数x, y。

Pixle(new) =

效果图

在这里插入图片描述

最后,本文只是介绍一些笔者的想法,若有错误,敬请指正,至于代码部分和实际坐标计算,需要实验者自行调整和计算映射关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值