OpenCV 3.1.0中的图像放缩与旋转
OpenCV在3.1.0版本中的图像放缩与旋转操作比起之前版本中更加的简洁方便,同时还提供多种插值方法可供选择。首先来看图像放缩,通过OpenCV核心模块API函数resize即可实现图像的放大与缩小。
一:图像放缩(zoom in/out)
函数resize相关API参数介绍
-src表示输入图像,类型一般是Mat类型
-dst表示输出图像,类型一般是Mat类型
-dsize表示输出图像大小,如果是零的话表示从fx与fy两个参数计算得到 dsize= Size(round(src.cols*fx), round(src.rows*fy))
-fx表示水平方向或者X方向的放缩因子,类型是浮点数
-fy表示垂直方向或者Y方向的放缩因子,类型是浮点数
-interpolation表示像素插值计算算法是哪一种。当前OpenCV 3.1.0中支持常见插值算法包括:
-临近点(INTER_NEAREST)、
-双线性插值(INTER_LINEAR)、
-立方插值(INTER_CUBIC)、
-LANCZOS4(INTER_LANCZOS4)、
-面积采样(INTER_AREA)
等八种像素插值方法。当对图像放大时候最常用的插值方法是双线性与立方插值方式,当对图像缩小时候OpenCV推荐使用的是面积采样方法。
API演示
-放大代码演示
-缩小代码演示
在放大时候基于临近点插值方法会产生锯齿,但是因为计算量比较少所以速度比较快,而线性插值与立方插值速度跟临近点插值相比速度没有优势但是都具备反锯齿能力。
运行效果
原图
0.75倍resize图像
1.25倍resize图像,基于线性插值
1.25倍resize图像,基于立方插值
二:旋转
图像绕原点逆时针旋转a角,其变换矩阵及逆矩阵(顺时针选择)的图像如下:
矩阵中最后一列表示原点坐标是(0, 0)但是对于实际图像来说使用的屏幕坐标其原点(0, 0)在左上角位置,而其真实的原点位置为(width/2, height/2)才是矩阵描述原点(0, 0)位置。其中width表示输入图像的宽度,height表示输入图像的高度。
OpenCV3.1.0中实现图像旋转需要用到的两个API函数分别是
- getRotationMatrix2D
- warpAffine
第一个函数是用来产生旋转矩阵M,第二个函数是根据旋转矩阵M实现图像指定角度的旋转。基于这两个API实现图像旋转的代码如下:
效果显示如下:
从上面旋转以后图像可以看到四个角被剪切掉了,无法显示,我们希望旋转之后图像还能够全部显示,在之前2.x的OpenCV版本中要实现这样的功能,需要很多的数学知识,而在3.1.0中只需要添加如下几行代码即可实现旋转之后的全图显示,代码实现如下:
旋转之后全图显示如下:
可以看出基于OpenCV3.1.0实现图像旋转的时候同样会涉及到像素插值问题,可以选择的插值算法跟放缩时候一致。在OpenCV3.1.0中默认的插值算法是线性插值(INTER_LINEAR=1)。
一年之计在于春、一日之计在于晨!
关注【OpenCV学堂】
长按或者扫码下面二维码即可关注
+OpenCV学习群 376281510
进群暗号:OpenCV