边界外推和边界处理--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::copyMakeBorder()和cv::borderInterpolate()_第1张图片
大多数情况下,cv::BORDER_REFLECT_101是OpenCV默认的选项,cv::BORDER_DEFAULT对应的就是cv::BORDER_REFLECT_101。在OpenCV上,cv::copyMakeBorder()函数就是为图像创建边框的函数。

如下图实验:

  • cv::BORDER_CONSTANT
    边界外推和边界处理--cv::copyMakeBorder()和cv::borderInterpolate()_第2张图片
  • cv::BORDER_REPLICATE
    边界外推和边界处理--cv::copyMakeBorder()和cv::borderInterpolate()_第3张图片
  • cv::BORDER_REFLECT
    边界外推和边界处理--cv::copyMakeBorder()和cv::borderInterpolate()_第4张图片
  • cv::BORDER_WARP
    边界外推和边界处理--cv::copyMakeBorder()和cv::borderInterpolate()_第5张图片

二、自定义外推

在某些情况下,我们需要计算某一特定像素所参考的像素的位置。
举个例子:
可以在混合的边界条件下计算一个特定像素的值,在一维中使用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

你可能感兴趣的:(opencv,计算机视觉,opencv,图像处理)