opencv边界处理
一、简介 图像卷积或者相关操作的时候,边界像素不能计算,因为没有完全和内核模板完全重合,所以当是3*3的模板时,最外的一层边界没被处理;5*5的模板有两层边界没被处理,可以通过在开始前增加边界外层的像素,卷积处理了边界像素后再去除多的像素。二、函数API2.1 copyMakeBorder()函数:void copyMakeBorder(InputArray src, OutputA...
一、简介
图像卷积或者相关操作的时候,边界像素不能计算,因为没有完全和内核模板完全重合,所以当是3*3
的模板时,最外的一层边界没被处理;5*5
的模板有两层边界没被处理,可以通过在开始前增加边界外层的像素,卷积处理了边界像素后再去除多的像素。
二、函数API
2.1 copyMakeBorder()函数:
void copyMakeBorder(InputArray src, OutputArray dst,
int top, int bottom, int left, int right,
int borderType, const Scalar& value = Scalar() );
参数src:原图。
参数dst:和原图一样的类型,大小是Size(src.cols+left+right,src.rows+top+bottom)
参数top,bottom,left,right:需要增加的上、下、左、右边界数目。
参数borderType:边界增加方式。
BorderTypes {
BORDER_CONSTANT = 0, //!< iiiiii|abcdefgh|iiiiiii 自己设置像素
BORDER_REPLICATE = 1, //!< aaaaaa|abcdefgh|hhhhhhh 复制最外层边界
BORDER_REFLECT = 2, //!< fedcba|abcdefgh|hgfedcb 镜像对称
BORDER_WRAP = 3, //!< cdefgh|abcdefgh|abcdefg
BORDER_REFLECT_101 = 4, //!< gfedcb|abcdefgh|gfedcba
BORDER_TRANSPARENT = 5, //!< uvwxyz|abcdefgh|ijklmno
BORDER_REFLECT101 = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
BORDER_DEFAULT = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
BORDER_ISOLATED = 16 //!< do not look outside of ROI
2.2 borderInterpolate()函数
int borderInterpolate(int p, int len, int borderType);
参数p: 该扩充图像的像素在基于原图某一坐标轴(x或y轴)上的坐标。
例如:原图x轴坐标起点是0,终点是src.cols - 1;那么扩充在左侧或右侧的一个像素坐标就是-1或src.cols
参数len: 扩充像素对应原图的坐标轴(x或y)的长度。一般是src.rows 、src.cols
参数borderType: 边界增加方式。
函数作用: 实际上copyMakeBorder()内部是调用了这个函数,
此函数的作用是:计算扩充之后的像素对应原图那个坐标轴的坐标(就是计算坐标)。
例如:假设原图边界扩充类型是BORDER_DEFAULT,要计算扩充的像素(-1,0),在原图x,y轴对应的坐标,
int x = borderInterpolate(-1,src.cols,BORDER_DEFAULT);
int y = borderInterpolate(0,src.rows,BORDER_DEFAULT);
输出对应坐标x = 1, y = 0
更多推荐
所有评论(0)