[OpenCV]拓展图像边界
2015-03-11 13:36
148 查看
图像处理中经常遇到使用当前像素邻的像素来计算当前像素位置的某些属性值,这样就会导致边界像素处越界访问,一般有两种方法解决这种问题:只对不越界的像素进行处理;对图像边界进行拓展,本文主要介绍如何使用OpenCV简单的对边界进行拓展。
OpenCV提供了几种不同的边界拓展策略:
[plain] view
plaincopy
* BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh
* BORDER_REFLECT: fedcba|abcdefgh|hgfedcb
* BORDER_REFLECT_101: gfedcb|abcdefgh|gfedcba
* BORDER_WRAP: cdefgh|abcdefgh|abcdefg
* BORDER_CONSTANT: iiiiii|abcdefgh|iiiiiii with some specified ’i’
以上内容取自OpenCV的帮助文档。其中 “|” 表示的是图像的边界,连个“|”中间是图像的内容,最后一个边界拓展策略还要额外给定一个i值,用于对额外的边界进行赋值。
使用OpenCV提供的函数copyMakeBorder()来拓展边界,其原型如下
[cpp] view
plaincopy
void copyMakeBorder( InputArray src, OutputArray dst, int top, int bottom, int left, int right, int borderType, const Scalar& value=Scalar() )
src:输入的数组。
dst:输出的拓展边界后的数组。
top:在src上边界向上拓展的行数。
bottom:在src下边界向下拓展的行数。
left:在src的左边界向左拓展的列数。
right:在src的右边界向右拓展的列数。
borderType:上一节中的边界拓展策略中的一个。
value:当你的边界策略使用的是BORDER_CONSTANT的时候,此处是指边界处填写的常数值。
用一个简单实例来解释下如何拓展边界。
[cpp] view
plaincopy
Mat extendedIm;
copyMakeBorder( orgIm, extendedIm, extRows, extRows, extCols, extCols, BORDER_REFLECT_101, Scalar::all(0) );
在实例中,上下边界分别拓展extRows行,左右分别拓展extCols列,使用的是BORDER_REFLECT_101,最有一个参数,可以不写,我这里写上是为了告诉大家函数可以填写这些参数。
以下是实验代码和结果:
[cpp] view
plaincopy
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char**argv){
Mat orgIm = imread("theImage.png");
int extRows = 19;
int extCols = 15;
Mat extendedIm;
copyMakeBorder( orgIm, extendedIm, extRows, extRows, extCols, extCols, BORDER_REFLECT_101);
imshow("original image", orgIm);
imshow("extended image", extendedIm);
waitKey();
return 0;
}
上图是原始图像。
上图是拓展后的图像。
边界的拓展方式
OpenCV提供了几种不同的边界拓展策略:[plain] view
plaincopy
* BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh
* BORDER_REFLECT: fedcba|abcdefgh|hgfedcb
* BORDER_REFLECT_101: gfedcb|abcdefgh|gfedcba
* BORDER_WRAP: cdefgh|abcdefgh|abcdefg
* BORDER_CONSTANT: iiiiii|abcdefgh|iiiiiii with some specified ’i’
以上内容取自OpenCV的帮助文档。其中 “|” 表示的是图像的边界,连个“|”中间是图像的内容,最后一个边界拓展策略还要额外给定一个i值,用于对额外的边界进行赋值。
边界拓展
使用OpenCV提供的函数copyMakeBorder()来拓展边界,其原型如下[cpp] view
plaincopy
void copyMakeBorder( InputArray src, OutputArray dst, int top, int bottom, int left, int right, int borderType, const Scalar& value=Scalar() )
src:输入的数组。
dst:输出的拓展边界后的数组。
top:在src上边界向上拓展的行数。
bottom:在src下边界向下拓展的行数。
left:在src的左边界向左拓展的列数。
right:在src的右边界向右拓展的列数。
borderType:上一节中的边界拓展策略中的一个。
value:当你的边界策略使用的是BORDER_CONSTANT的时候,此处是指边界处填写的常数值。
实例
用一个简单实例来解释下如何拓展边界。[cpp] view
plaincopy
Mat extendedIm;
copyMakeBorder( orgIm, extendedIm, extRows, extRows, extCols, extCols, BORDER_REFLECT_101, Scalar::all(0) );
在实例中,上下边界分别拓展extRows行,左右分别拓展extCols列,使用的是BORDER_REFLECT_101,最有一个参数,可以不写,我这里写上是为了告诉大家函数可以填写这些参数。
以下是实验代码和结果:
[cpp] view
plaincopy
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char**argv){
Mat orgIm = imread("theImage.png");
int extRows = 19;
int extCols = 15;
Mat extendedIm;
copyMakeBorder( orgIm, extendedIm, extRows, extRows, extCols, extCols, BORDER_REFLECT_101);
imshow("original image", orgIm);
imshow("extended image", extendedIm);
waitKey();
return 0;
}
上图是原始图像。
上图是拓展后的图像。
相关文章推荐
- [OpenCV]拓展图像边界
- [OpenCV]拓展图像边界
- [OpenCV]拓展图像边界
- [OpenCV]拓展图像边界
- [OpenCV]拓展图像边界
- OpenCV编程->图像边界拓展copyMakeBorder
- [OpenCV]拓展图像边界
- 在OpenCV中图像边界扩展 copyMakeBorder 的实现
- OpenCV之imgproc 模块. 图像处理(2)实现自己的线性滤波器 给图像添加边界 Sobel 导数 Laplace 算子 Canny 边缘检测
- 在OpenCV中图像边界扩展 copyMakeBorder 的实现
- 在OpenCV中图像边界扩展 copyMakeBorder 的实现
- Python-OpenCV 处理图像:图像中边界和轮廓检测
- 基于opencv的自编二值化图像的腐蚀,并与原图像相减得到边界
- Python-OpenCV 处理图像(四)(五):图像直方图和反向投影 图像中边界和轮廓检测
- 图像边界填充OpenCV
- 调用OpenCV的cvFindContours方法获取图像边界
- 在OpenCV中图像边界扩展 copyMakeBorder 的实现
- 在OpenCV中图像边界扩展 copyMakeBorder 的实现
- opencv:扩充图像边界—copyMakeBorder()函数