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
- Learning OpenCV3: computer vision in C++ with the OpenCV Library
|