图像的几何变换是指在不改变图像像素值的前提下对图像像素及逆行空间集合变换,常见的几何变换有距离变换、坐标映射、平移、镜像、旋转、缩放、仿射变换等
图像的坐标映射是通过原图像与目标图像之间建立一种映射关系,这种映射关系有两种:一种是计算原图像任意像素在映射后图像后的坐标位置;二是计算变换后图像任意像素反应设在原图像的坐标位置。由原图像映射到目标图像称为正映射,相反地,由目标图像通过映射关系得到原图像称为反映射。由于正映射常常会映射不完全以及出现映射重复现象,一般在图像处理的过程中采取反映射的方式来保证输出目标图像的每个像素都可以通过映射关系在源图像中找到唯一的对应像素。
OpenCV中提供重映射相关操作,重映射是指把一个图像中一个位置的像素通过映射关系转换到零一图像的指定位置。对于输入源图像f(x,y),目标图像为g(x,y),映射关系为T,则满足
需要注意的是通过映射关系T实现得到的目标图像可能存在目标图像像素值是非整数的情况,一般可以考虑插值或向上取整。
void remap(InputArray src,OutputArray dst,InputArray map1,InputArray map2,
int interpolation,int borderMode=BORDER_CONSTANT,const Scallar& borderValue=Scalar())
图像重映射操作。map1表示(x,y)点的坐标或x坐标,可以是CV_16SC2,CV_32FC1,CV_32FC2类型;map2表示y坐标,可以是CV_16UC1,CV_32FC1类型,如果map1为(x,y),map2则可以选择不用;interpolation表示插值方法;borderMode表示边界插值类型;borderValue表示插值数值。
应用举例
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("C:\\Users\\32498\\Pictures\\16.png");
if (!src.data)
{
return -1;
}
//输出矩阵定义
Mat result(src.size(), src.type());
//x方向与y方向矩阵
Mat xMap(src.size(), CV_32FC1);
Mat yMap(src.size(), CV_32FC1);
//取图像的宽和高
int rows = src.rows;
int cols = src.cols;
//图像遍历
for (int j = 0; j < rows; j++)
{
for (int i = 0; i < cols; i++)
{
//x与y均翻转
xMap.at(j, i) = cols - i;
yMap.at(j, i) = rows - j;
}
}
//重映射操作
remap(src, result, xMap, yMap, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
//输出结果
imshow("src", src);
imshow("result", result);
waitKey();
return 0;
}