OpenCV imgproc模块(二)

变换:
我们这节要提一下opencv重映射的概念。
重映射,就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。为了完成映射过程,需要获得一些插值为非整数像素的坐标,因为原图像与目标图像的像素坐标不是一一对应的。我们通过重映射来表达每个像素的位置(x,y)。
g(x,y) = f(h(x,y))。
重映射比如可以进行图像翻转,如h(x,y) = (I.cols-x,y)就是相对于x方向的翻转。在opencv中,可以使用remap来实现简单重映射。
remap()函数会根据指定的映射形式,将原图像进行重映射几何变换,基于公式如下:
dst(x,y)=src(mapx(x,y),mapy(x,y))


 Mat srcImage,dstImage;
 Mat map_x,map_y;
 srcImage = imread("1.jpg");
 imshow("srcImage原图像",srcImage);
 //创建和原始图一样的效果图,x重映射图,y重映射图
 dstImage.create(srcImage.size(),srcImage.type());
 map_x.create(srcImage.size(),CV_32FC1);
 map_y.create(srcImage.size(),CV_32FC1);
 //遍历每一个像素点,改变map_x和map_y的值
 for (int j=0;j<srcImage.rows;j++)
 {
     for (int i =0;i<srcImage.cols;i++)
     {
         map_x.at<float>(j,i) = i;
         map_y.at<float>(j,i) = srcImage.rows - j;
     }
 }
 remap(srcImage,dstImage,map_x,map_y,CV_INTER_LINEAR);
 imshow("上下颠倒",dstImage);

仿射变换及warpAffine和getRotationMatrix2D:
放射变换是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间的过程。一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着加上一个向量(平移)的形式。
我们能够用仿射变换来表示如下三种常见的变换形式:
旋转Ratation(线性变换) 平移 translation(向量加) 缩放 scale(线性变换)
仿射变换代表的是两幅图之间的一种映射关系。
我们通常使用2*3的矩阵来表示仿射变换。
这里写图片描述

OpenCV仿射变换相关的函数一般涉及到warpAffine和getRotationMatrix2D。其中warpAffine实现一些简单的重映射,getRotationMatrix2D来获得旋转矩阵。
warpAffine函数的作用是根据以下公式,对图像做仿射变换。
dst(x,y)=src(M11x+M12y+M13,M21x+M22y+M23)
这里写图片描述

Mat getAffineTransform(InputArray src,InputArray dst);获得仿射变换的变换矩阵。

getRotationMatrix2D()函数
用于计算二维旋转变换矩阵。变换会将旋转中心映射到它自身。
函数原型如下:

Mat getRotationMatrix2D(point2f center,double angle,double scale)

第一个参数表示原图像的旋转中心。
第二个参数表示旋转角度,为正表示逆时针旋转。
第三个参数是缩放系数。
这里写图片描述
这里写图片描述
注意这种仿射、旋转的代码特点

通过getAffineTransform()和getRotationMatrix2D()得到变换矩阵,然后使用warpAffine方法进行变换。。
而getAffineTransform通过使用一个3个点的对应坐标关系可以求出变换矩阵
而getRotationMatrix2D参见上面的函数原型说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值