详解OpenCV的坐标重映射函数remap()的两种使用方法并附使用它得到图像的水平镜像和垂直镜像的示例代码

OpenCV的函数remap()可以实现图像像素坐标的重映射。

什么叫图像像素坐标的重映射?

注意:“重映射”中的“重”字的含义是“重新”的意思。

下面这张图显示了什么叫像素坐标的重映射。

 上图中:
坐标为(1,2)的点的坐标变成了(7,8);
坐标为(1,3)的点的坐标变成了(7,9);
坐标为(1,4)的点的坐标变成了(7,10);

这就是坐标重映射的一个简单例子。

接下来说说函数remap()。

函数remap()的原型如下:

C++: void remap(InputArray src, 
				OutputArray dst, 
				InputArray map1, 
				InputArray map2, 
				int interpolation, 
				int borderMode=BORDER_CONSTANT, 
				const Scalar& borderValue=Scalar())

下面介绍各个参数的意义:

src---输入图像。
dst---目标图像,它和映射表map1的尺寸相同,数据类型与src相同。
map1---映射表map1,映射表map1可以是一通道的矩阵,也可以是二通道的矩阵。

对映射表map1的理解是掌握函数remap()使用的关键,
关于映射表map1的详细介绍,
请大家浏览本博文的原文获取,
本博文的原文链接:

https://www.hhai.cc/thread-181-1-1.html

map2---映射表map2,映射表map2只可以是一通道的矩阵。其意义与映射表map1相同,只是它里面存储的是映射后新坐标在y方向上的坐标。其type只能为CV_32FC1(虽然官方文档上说它的type可以为CV_16UC1,但是经实测是不行的)。当映射表map1为二通道矩阵时,map2为空矩阵,即按下面这句话定义:

cv::Mat map2;


interpolation---这个参数用于选择插值方式,可选的插值方式如下:

上图中用红线杠了的是不能选的插值方式。

问:函数remap()为什么会牵涉到插值?答:因为输出图像的尺寸并不一定和原图像尺寸相同,而与映射表的尺寸相同。举个例子来说,原图像为100×50的图像,而映射表是120×60的矩阵,那输出图像的尺寸也就是120×60,可见比原图扩大了,也就是说多出来一些像素点,那多出来的像素点的值怎么取呢?这就需要作插值运算来得到了。

borderMode--边界扩展模式,默认值为BORDER_CONSTANT。为什么函数remap()会牵涉到边界的扩展处理,因为在插值的时候我们需要用到窗口矩阵,一旦涉汲到窗口矩阵参与运算,就要牵涉到边界的扩展处理了。详情见我的另一篇博文:https://www.hhai.cc/thread-178-1-1.html

borderValue---当边界扩展模式为BORDER_CONSTANT时,是需要指定一个常数的。borderValue的默认值为0。

关于坐标重映射函数remap()的两种使用方法分别实现图像的水平镜像和垂直镜像的两个C++代码,
请大家访问本博文的原文获取,
本博文的原文链接如下:

https://www.hhai.cc/thread-181-1-1.html

两个代码的运行结果如下:

从上图可以看出,代码实际了原图像的水平镜像和垂直镜像。

 从上图的运行结果中可以看出,代码实现了原图像的水平镜像。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值