opencv边界处理

一、简介

  图像卷积或者相关操作的时候,边界像素不能计算,因为没有完全和内核模板完全重合,所以当是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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值