原理
- 把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像。简单来说,就是把一个图像中一个位置的像素放置到另一个图片指定位置的过程。
- 假设我们有一个图像 I , 我们想满足下面的条件作重映射:
h(x,y) = (I.cols - x, y )
图像会按照 x 轴方向发生水平翻转:
- 为了完成映射过程, 有必要获得一些插值为非整数像素坐标,因为源图像与目标图像的像素坐标不是一一对应的.
API介绍:remap
-
remap(
InputArray src, //输入图像
OutputArray dst, //输出图像
InputArray map_x, // x 映射表 CV_32FC1/CV_32FC2
InputArray map_y, // y 映射表 CV_32FC1/CV_32FC2
int interpolation, //插值方法,线性差值等
int borderMode, //边缘填充方法,默认BORDER_CONSTANT
const Scalar borderValue //color
) -
注1:interpolation 插值方式:
-
注2:borderMode:图像边界处理方式,边界的类型有以下几种:
1)BORDER_REPLICATE:重复: aaaaaa|abcdefgh|hhhhhhh
2)BORDER_REFLECT:反射: fedcba|abcdefgh|hgfedcb
3)BORDER_REFLECT_101:反射101: gfedcb|abcdefgh|gfedcba
4)BORDER_WRAP:外包装: cdefgh|abcdefgh|abcdefg
5)BORDER_CONSTANT:常量复制: iiiiii|abcdefgh|iiiiiii(i的值由后一个参数Scalar()确定,如Scalar::all(0) ) -
注3:borderValue:若上一参数为BORDER_CONSTANT,则由此参数确定补充上去的像素值。可选用默认值。
完整代码示例:
Mat src, dst, map_x, map_y;
int index = 0;
void update_map(int, void*);
int main()
{
src = imread("E:/Image/ylj.jpg");
if (src.empty())
{
cout << "could not load image..." << endl;
return 0;
}
imshow("src image", src);
m