开发环境为:win10+QT5.8+opencv3.2
将图像按照某种法则或规律变换成另一种几何图像的过程叫做图像的几何变换。通常包括图像平移、图像旋转、图像镜像变换、图像缩放等,本文主要实现图像平移、图像旋转、图像缩放。
一、读取图像
读取图像见QT+opencv学习笔记(1)——图像点运算,这里不再赘述。
读取结果如下图:
二、图像平移
图像平移就是将图像上的所有点按照指定的平移量进行水平和垂直移动。假设在x轴方向移动Tx个单位,在y轴方向移动Ty个单位,可用矩阵M来描述平移关系。
在opencv中可以用仿射变换来描述两幅图像之间的关系,如旋转、平移关系等。通过warpAffine()函数实现仿射变换。warpAffine()函数的定义如下:
void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize,int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
参数主要含义如下:
src: 输入图像 ;
dst: 输出图像,尺寸由dsize指定,图像类型与原图像一致 ;
M: 2X3的变换矩阵 ;
dsize: 指定图像输出尺寸 ;
flags: 插值算法标识符,默认值为双线性插值;
插值方法主要有以下几种:
- INTER_NEAREST - 最邻近插值
- INTER_LINEAR - 双线性插值,为默认的插值方法
- INTER_AREA - 区域插值算法
- INTER_CUBIC - 双立方插值,超过4x4像素邻域
- INTER_LANCZOS4 - 超过8x8像素邻域的Lanczos插值
borderMode: 边界像素模式,默认值为BORDER_CONSTANT ;
borderValue: 边界取值,默认值为Scalar()。图像平移主要代码如下:
int Tx = 100; //水平平移量 int Ty = 200; //竖直平移量 //定义平移矩阵 Mat tranMatrix = (Mat_<float>(2, 3) << 1, 0, Tx, 0, 1, Ty); //根据平移矩阵进行仿射变换 warpAffine(grayImg, tranImg, tranMatrix, sizeTranImg);
图像平移处理结果如下:
三、图像旋转
图像旋转涉及两个比较重要的问题,旋转中心和旋转角度。一般以图像的中心作为旋转中心。
旋转后保持原图大小,超过的部分裁剪掉。
通过getRotationMatrix2D函数来获取旋转矩阵。
函数定义如下:
Mat cv::getRotationMatrix2D ( Point2f center, double angle, double scale )
参数主要含义如下:
center: 图像的旋转中心;
angle: 图像旋转角度 ;
scale: 缩放系数 。
图像旋转主要代码如下:
Mat rotImg; //定义旋转后的图像 Size sizeRotImg = grayImg.size();//定义旋转后的图像的大小 float rotAngle = 30; //定义旋转角度 Point2f center(grayImg.cols / 2., grayImg.rows / 2.); //指定图像旋转中心 cv::Mat rot_mat = cv::getRotationMatrix2D(center, rotAngle, 1.0); //获取旋转矩阵(2x3矩阵) cv::warpAffine(grayImg, rotImg, rot_mat, sizeRotImg); //根据旋转矩阵进行仿射变换
图像旋转处理结果如下:
四、图像缩放
图像缩放可通过resize()函数调整图像的大小。
函数定义如下:
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR );
参数主要含义如下:
src:输入的原图像;
dst:输出的调整大小之后的图像;
dsize:输出图像的大小。
fx:width方向的缩放比例,如果它是0,那么它就会按照(double)dsize.width/src.cols来计算;
fy:height方向的缩放比例,如果它是0,那么它就会按照(double)dsize.height/src.rows来计算;
interpolation:指定插值的方式,默认为双线性插值,其它插值方式和warpAffine()函数的一致。
主要代码如下:
Mat zoomImg; //定义缩放后的图像 cv::resize(grayImg, zoomImg, Size(0,0), 0.5, 0.5);//使用默认的双线性插值缩放图像
图像缩放处理结果如下:
图像水平和垂直方向分别缩放一倍,然后在将其显示到QLabel中后,由于尺寸的变化,图像会变模糊,缩放10倍效果更明显。
整体工程代码见QT+opencv图像几何变换,包括图像平移,图像旋转,图像缩放
参考:
(1)opencv学习(三十五)之仿射变换warpAffine