重映射的概念
重映射就是把一幅图像中的某位置的像素放置到另一个图片的指定位置的过程。为了完成映射过程,需要获取一些插值为非整数像素的坐标,因为源图像与目标图像的像素坐标不是一一对应的。一般情况下,我们通过重映射来表达每个像素的位置(x,y),想这样
在这里,g()是目标图像,f()是源图像,而h(x,y)是作用于(x,y)的映射方法函数。
在OpenCV中,可以使用函数remap()来实现简单重映射。
实现重映射:remap() 函数
remap()函数会根据指定的映射形式,将源图像进行重映射几何变换,基于的公式为
需要注意,此函数不支持就地操作
void remap(InputArray src,
OutputArray dst,
InputArray map1,
InputArray map2,
int interpolation,
int borderMode =BORDER_CONSTANT,
const Scalar& borderValue =Scalar());
函数参数详解
代码示例:
NSString *image = @"dkdk.jpg";
UIImage *image1 = [UIImage imageNamed:image];
Mat im;
UIImageToMat(image1, im);
if (im.empty()) { return; }
Mat srcImage,dstImage;
Mat map_x,map_y; // 创建和原始图一样的效果图,x重映射图,y重映射图
dstImage.create(im.size(), im.type());
map_x.create(im.size(), CV_32FC1);
map_y.create(im.size(), CV_32FC1);
// 双层循环,遍历每一个像素点,改变map_x和map_y的值
for (int j = 0; j < im.rows; j++) {
for (int i = 0; i < im.cols; i++) {
map_x.at(j,i) = static_cast(i);
map_y.at(j,i) = static_cast(im.rows - j);
}
}
remap(im, dstImage, map_x, map_y, INTER_LINEAR);
self.secondImageView.image = MatToUIImage(dstImage);
网友评论