图像的仿射变换是指在空间直角坐标系中将一个二维坐标转换到另一个二维坐标,仿射变换是一种线性变换,可以表示为线性变换(即矩阵相乘)与平移过程,即.,通常我们用2x3的矩阵表示仿射变换矩阵:,下面列举上一章常见操作的仿射变换矩阵(右乘变换矩阵):
平移://向水平方向x轴平移b1单位,y轴平移b2单位(坐标系看上一章)
缩放://水平方向缩放为a,垂直方向缩放为b
旋转://x'=xcos-ysin,y'=xsin+ycos
斜切://图像倾斜角度操作
在使用opencv进行仿射变换时,会先计算一个仿射变换矩阵。
Ps:图形旋转之后,边缘有渐变平滑的锯齿,所以旋转后,本图不再是二值图像,有渐变灰度。
getAffineTransform函数作用是点仿射变换,其用法是warpMat = getAffineTransform(srcPoint,resPoint);//源图像上的点和目标图像上的点
e.g:cv::Point2f srcPoint[3];//构造三个含有两个元素的二重数组
cv::Point2f resPoint[3];
srcPoint[0]=cv::Point2f(0,0);
srcPoint[1]=cv::Point2f(nCols-1,0);
srcPoint[2]=cv::Point2f(0,nRows-1);
resPoint[0]=cv::Point2f(nCols*0,nRows*0.33);
resPoint[1]=cv::Point2f(nCols*0.85,nRows*0.25);
resPoint[2]=cv::Point2f(nCols*0.15,nRows*0.7);
cv::Mat warpMat(cv::Size(2,3),CV_32F);
cv::Mat resultImage = cv::Mat::zeros(srcImage.rows,srcImage.cols,srcImage.type());//
warpMat=getAffineTransform(srcPoint,resPoint);
warpAffine(srcImage,resultImage,warpMat,resultImage.size());
getRotationMatrix2D函数作用是角仿射变换,其用法是getRotationMatrix2D(centerPoint,angle,scale)//其中centerPoint表示选择中心,angle表示角度,scale表示缩放倍数。
e.g:cv::Point2f centerPoint = cv::Point2f(nCols/2,nRows/2);
double angle = -50;
double scale = 0.7;
warpMat = getRotationMatrix2D(centerPoint,angle,scale);
warpAffine(srcImage,resultImage,warpMat,resultImage.size());
warpAffine函数作用是对srcImage图像进行warpMat类型的仿射变换并保存在resultImage图像中,其图像大小为resultImage.size();