本文作者:小嗷
微信公众号:aoxiaoji
简书链接:https://www.jianshu.com/u/45da1fbce7d0
在本篇中,您将学习:
使用OpenCV函数cv::remap实现简单的重新映射例子。
本文你会找到以下问题的答案:
cv::remap
提取相关源码 + 测试
2.1 理论
什么是重映射?
它是从图像中的一个位置获取像素并将它们定位到新图像的另一个位置的过程。
为了完成映射过程,可能需要对非整数像素位置进行一些插值,因为源图像和目标图像之间并不总是存在一对一的对应关系。
我们可以将每个像素位置(x,y)的重新映射表示为:
其中g()为重新映射的图像,f()为源图像,h(x,y)为作用于(x,y)的映射函数。
让我们举个简单的例子。假设我们有一个图像I,比方说,我们想重新映射:
得到的目标图像将是按照x轴方向发生翻转。
其中要变换的模式如下:
映射分为向前映射和向后映射。将输入映射到输出的向前映射,反则就是向后映射。即如果已知源图像到目标图像的坐标变换,即可以知道源图像的一点在变换后在目标图像的位置,称为向前映射。如果知道目标图像的一点在变换前在源图像上的位置,称为向后映射。向后映射比较直观,计算量小,OpenCV中经常使用的图像变换都是采用向后映射的方法来处理。但向后映射需要知道变换的反变换公式,但在有些变换比较复杂的场合,这个反变换是很难得到的。此时就需要采用前向映射的方法进行变换了。
这里对OpenCV中remap函数进行了提取,目前支持uchar和float两种类型,经测试,与OpenCV3.1结果完全一致。
测试代码test_remap.cpp:
在代码部分将更清楚地看到这一点。
代码链接:
https://pan.baidu.com/s/1BgDxfCbO4hb7OzjbVE3LDA
密码: vbkw
3.1 remap()
重映射:就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。
函数remap使用指定的映射来转换源映像:
使用一种可用的插值方法计算具有非整数坐标的像素值。mapx和mapy可以分别在map1和map2中编码为独立的浮点映射,或者在map1中(x,y)的交错浮点映射,或者使用收敛映射创建定点映射。您可能想要从浮动到定点的映射转换的原因是它们可以产生更快的(2x)重新映射操作。在转换的情况下,map1包含对(cvFloor(x)、cvFloor(y))和map2包含插补系数表中的索引。
本篇文章的代码如下所示。
源图:
效果图:
解释一下:
载入一副图像
创建目标图像和两个映射矩阵(x和y)
创建一个窗口来显示结果
建立一个循环。每1000毫秒我们更新映射矩阵(mat_x和mat_y)并将它们应用到源映像:
领取专属 10元无门槛券
私享最新 技术干货