【图像处理】OpenCV系列十七 --- 几何图像变换函数详解(
上一篇我们学习了仿射变换的warpAffine函数,知道了如何用这个函数对图像进行旋转、平移等操作,那么本节我们一起来学习一下与仿射变换相关的其他函数以及相关的几何图像变换。
一、convertMaps()函数
1、函数原型
void convertMaps(InputArray map1,
InputArray map2,
OutputArray dstmap1,
OutputArray dstmap2,
int dstmap1type,
bool nninterpolation = false);
2、函数功能
将图片的变换映射从一种形式转换为另一种形式。
格式如下:
( (map1.type(), map2.type()) → (dstmap1.type(), dstmap2.type()) )
会支持下面的几种操作:
-
(CV_32FC1, CV_32FC1)→(CV_16SC2, CV_16UC1)
这是一种最常用的转换操作,将原图浮点映射转换为更为紧促和更快的顶点表示!第一个输出里面存储圆角坐标,第二个输出存储插值表中的索引(当函数的参数nninterpolation = false时创建); -
(CV_32FC2)→(CV_16SC2, CV_16UC1)
与第一种类似,但是原图映射在一个2通道的矩阵中; -
反向转换,显然,重建的浮点映射与原图的浮点映射不会完全相同!
3、参数详解
-
第一个参数,InputArray map1,第一个输入映射,一般它的类型为 CV_16SC2, CV_32FC1, or CV_32FC2;
-
第二个参数,InputArray map2,第二个输入映射,一般它的类型为CV_16UC1, CV_32FC1,以及空的矩阵(none);
-
第三个参数,OutputArray dstmap1,第一个输出映射,类型通过dstmap1type定义,尺寸与原图像一致;
-
第四个参数,OutputArray dstmap2,第二个输出映射;
-
第五个参数,int dstmap1type,第一个输出映射的类型应该为 CV_16SC2, CV_32FC1, or CV_32FC2;
-
第六个参数,bool nninterpolation = false,插值的选择方式,默认选择为最近邻插值(INTER_NEAREST),否则将会使用更加复杂的插值方式!
二、getAffineTransform()函数
1、函数原型
Mat getAffineTransform( const Point2f src[],
const Point2f dst[] );
Mat getAffineTransform( InputArray src,
InputArray dst );
2、函数功能
用三对相对应的点计算图像的仿射变换;该函数计算仿射变换的2x3矩阵。
具体公式如下:
其中:
仿射变换3、参数详解
-
第一个参数,const Point2f src[],原图像三角形在坐标系中的顶点坐标;
-
第二个参数,const Point2f dst[],目标图像三角形在坐标系中的顶点坐标;
-
返回值,返回一个2x3的仿射矩阵。
三、getPerspectiveTransform()函数
1、函数原型
Mat getPerspectiveTransform(const Point2f src[],
const Point2f dst[],
int solveMethod = DECOMP_LU);
Mat getPerspectiveTransform(InputArray src,
InputArray dst,
int solveMethod = DECOMP_LU);
2、函数功能
用四对相对应的点计算图像的透视变换;
函数计算透视变换的3x3矩阵;
具体公式如下:
其中:
透视变换3、参数详解
-
第一个参数,const Point2f src[],原图像四边形在坐标系中的顶点坐标;
-
第二个参数,const Point2f dst[],目标图像四边形在坐标系中的顶点坐标;
-
第三个参数,int solveMethod = DECOMP_LU,矩阵分解的类型,默认为DECOMP_LU(用最佳的枢轴单元进行高斯分解)
-
返回值,返回3x3透视变换矩阵
关于第三个参数,矩阵分解的类型还有以下几种分解方式:
矩阵分解的类型四、getRectSubPix()函数
1、函数原型
void getRectSubPix(InputArray image,
Size patchSize,
Point2f center,
OutputArray patch,
int patchType = -1);
2、函数功能
从原图像中提取提取一个感兴趣的矩形区域图像;
具体的公式如下:
其中使用双线性内插检索非整数坐标处的像素的值,多通道的图像对每个通道进行单独处理;图像可以是单通道图像,也可以是三通道图像;矩形的中心必须在图像内部,矩形的一部分可以在图像外部;
3、参数详解
-
第一个参数,InputArray image,原图像,即输入的图像;
-
第二个参数,Size patchSize,感兴趣区域的大小 ;
-
第三个参数,Point2f center,从原图像中提取感兴趣区域中心的浮点坐标位置,这个中心坐标必须在原图像内部;
-
第四个参数,OutputArray patch,输出感兴趣区域的图像,这个图像的大小为第二个参数patchSize,并且与原图像具有同样的通道数;
-
第五个参数,int patchType = -1,感兴趣区域图像的深度,默认情况下与原图具有同样的深度。
五、getRotationMatrix2D()函数
1、函数原型
Mat getRotationMatrix2D(Point2f center,
double angle,
double scale);
2、函数功能
计算二维旋转的仿射矩阵;
具体的公式如下:
其中,
仿射矩阵3、参数详解
-
第一个参数,Point2f center,图像旋转的中心点的坐标;
-
第二个参数,double angle,图像旋转的角度;
-
第三个参数,double scale,图像缩放的比例因子;
-
返回值,返回旋转之后的矩阵。
六、invertAffineTransform()函数
1、函数原型
void invertAffineTransform(InputArray M,
OutputArray iM);
2、函数功能
逆仿射变换,计算由2×3矩阵M表示的逆仿射变换,
具体的公式如下:
输出是一个2×3的矩阵,与M具有相同的类型。
3、参数详解
第一个参数,InputArray M,原来的仿射变换;
第二个参数,OutputArray iM,逆仿射变换。
我是奕双,现在已经毕业将近两年了,从大学开始学编程,期间学习了C需要编程,C++需要编程,Win32编程,MFC编程,毕业之后进入一家图像处理相关领域的公司,掌握了用OpenCV对图像进行处理,如果大家对相关领域感兴趣的话,可以关注我,我这边会为大家进行解答哦!如果大家需要相关学习资料的话,可以私聊我哦!