边界外推和边界处理--cv::copyMakeBorder()和cv::borderInterpolate()

OpenCV 边界外推和边界处理

一、边界外推

在图像处理的时候,我们会面临对边界的处理问题。 在OpenCV中的滤波操作,得到的输出图像与源图像的形状是一样的。 为了实现这种效果,OpenCV采用的是一种方法是在源图像周围添加虚拟像素。 下面有以下几种方式添加虚拟像素:

  • cv::BORDER_CONSTANT, 为每个边框像素赋予一个相同的值,这个值通过传入的参数给定。
  • cv::BORDER_WARP, 为每个像素分配一个距离,这个距离是像素点到源图像的边缘的距离,然后将距离对边相同距离的像素的值赋予对应的边框像素。
  • cv::BORDER_REPLICATE, 将源图像以外的像素全部赋值为图像边缘像素的值。
  • cv::BORDER_REFLECT, 为边框内每个像素复制了源图像内距离同一个边界 n n n对应像素点的值。
  • cv::BORDER_REFLECT_101,为边框内每个像素复制了源图像内距离同一边界 n + 1 n+1 n+1对应的像素点的值。

示意图如下所示:
在这里插入图片描述
大多数情况下,cv::BORDER_REFLECT_101是OpenCV默认的选项,cv::BORDER_DEFAULT对应的就是cv::BORDER_REFLECT_101。在OpenCV上,cv::copyMakeBorder()函数就是为图像创建边框的函数。

如下图实验:

  • cv::BORDER_CONSTANT
    在这里插入图片描述
  • cv::BORDER_REPLICATE
  • cv::BORDER_REFLECT
    在这里插入图片描述
  • cv::BORDER_WARP
    在这里插入图片描述

二、自定义外推

在某些情况下,我们需要计算某一特定像素所参考的像素的位置。
举个例子:
可以在混合的边界条件下计算一个特定像素的值,在一维中使用BORDER_REFLECT_101,在另一个维度中使用BORDER_WRAP:

float val; = img.at<float>(cv::borderInterpolate(100, img.rows, BORDER_REFLECT_101,
						   cv::borderInterpolate(-5, img.cols, BORDER_WRAP));

Reference

  1. Learning OpenCV3: computer vision in C++ with the OpenCV Library
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值