目标
本教程向你展示如何使用OpenCV函数 remap 来实现简单重映射.
理论
重映射是什么意思?
-
把一个图像中一个位置的像素放置到另一个图片指定位置的过程.
-
为了完成映射过程, 有必要获得一些插值为非整数像素坐标,因为源图像与目标图像的像素坐标不是一一对应的.
-
我们通过重映射来表达每个像素的位置 :
这里 是目标图像, 是源图像, 是作用于 的映射方法函数.
-
让我们来思考一个快速的例子. 想象一下我们有一个图像 , 我们想满足下面的条件作重映射:
会发生什么? 图像会按照 轴方向发生翻转. 例如, 源图像如下:
看到红色圈关于 x 的位置改变( 轴水平翻转):
-
通过 OpenCV 的函数 remap 提供一个简单的重映射实现.
说明
-
首先准备程序用到的变量:
-
加载一幅图像:
-
创建目标图像和两个映射矩阵.( x 和 y )
-
创建一个窗口用于展示结果.
-
建立一个间隔1000毫秒的循环,每次循环执行更新映射矩阵参数并对源图像进行重映射处理(使用 mat_x 和 mat_y),然后把更新后的目标图像显示出来:
上面用到的重映射函数 remap. 参数说明:
- src: 源图像
- dst: 目标图像,与 src 相同大小
- map_x: x方向的映射参数. 它相当于方法 的第一个参数
- map_y: y方向的映射参数. 注意 map_y 和 map_x 与 src 的大小一致。
- CV_INTER_LINEAR: 非整数像素坐标插值标志. 这里给出的是默认值(双线性插值).
- BORDER_CONSTANT: 默认
如何更新重映射矩阵 mat_x 和 mat_y? 请继续看:
-
更新重映射矩阵: 我们将分别使用4种不同的映射:
-
图像宽高缩小一半,并显示在中间:
所有成对的参数 处理后都符合: 和
-
图像上下颠倒:
-
图像左右颠倒:
-
同时执行b和c的操作:
-
下面的代码片段说明上述的映射过程. 在这里 map_x 代表第一个坐标 h(i,j) , map_y 是第二个坐标.
结果
-
上面的代码编译后, 运行时给一个图片路径参数. 例如,使用下面的图片:
-
图像宽高缩小一半,并显示在中间:
-
图像上下颠倒:
-
图像左右颠倒:
-
两个方向同时颠倒: