opencv图像处理学习(六)——仿射变换

图像的仿射变换是指在空间直角坐标系中将一个二维坐标转换到另一个二维坐标,仿射变换是一种线性变换,可以表示为线性变换(即矩阵相乘)与平移过程,即\begin{bmatrix} x' \\ y' \end{bmatrix}=\begin{bmatrix} m11 &m12 \\ m21& m22 \end{bmatrix}\begin{bmatrix} x \\ y \end{bmatrix}+\begin{bmatrix} n1 \\ n2 \end{bmatrix}.,通常我们用2x3的矩阵表示仿射变换矩阵:M=\begin{bmatrix} m11 &m12 &n1 \\ m21&m22 &n2 \end{bmatrix},下面列举上一章常见操作的仿射变换矩阵(右乘变换矩阵):

平移:M=\begin{bmatrix} 1&0 &b1 \\ 0& 1 & b2 \end{bmatrix}//向水平方向x轴平移b1单位,y轴平移b2单位(坐标系看上一章)

缩放:M=\begin{bmatrix} a &0 &0 \\ 0& b & 0 \end{bmatrix}//水平方向缩放为a,垂直方向缩放为b

旋转:\begin{bmatrix} cos\theta &sin\theta & 0\\ -sin\theta & cos\theta & 0 \end{bmatrix}//x'=xcos\theta-ysin\theta,y'=xsin\theta+ycos\theta

斜切:M=\begin{bmatrix} 1 & tan\alpha & 0\\ 0 & 1 & 0 \end{bmatrix}//图像倾斜\alpha角度操作

在使用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();

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值