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
两个代码的运行结果如下:
从上图可以看出,代码实际了原图像的水平镜像和垂直镜像。
从上图的运行结果中可以看出,代码实现了原图像的水平镜像。
今天的文章详解OpenCV的坐标重映射函数remap()的两种使用方法并附使用它得到图像的水平镜像和垂直镜像的示例代码分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/6460.html