首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

在OpenCV中图像地界扩展 copyMakeBorder 的实现

2012-12-19 
在OpenCV中图像边界扩展 copyMakeBorder 的实现1. 边界处理的类型2. opencv的实现在图像处理中,经常需要空

在OpenCV中图像边界扩展 copyMakeBorder 的实现
1. 边界处理的类型

2. opencv的实现


在图像处理中,经常需要空域或频域的滤波处理,在进入真正的处理程序前,需要考虑图像边界情况。

通常的处理方法是为图像增加一定的边缘,以适应 卷积核 在原图像边界的操作。


1. 增加边界的类型有以下4个类型:

以一行图像数据为例,abcdefgh是原图数据,|是图像边界,为原图加边

aaaaaa|abcdefgh|hhhhhhh     重复

fedcba|abcdefgh|hgfedcb    反射

gfedcb|abcdefgh|gfedcba  反射101,相当于上一行的左右互换

cdefgh|abcdefgh|abcdefg  外包装

iiiiii|abcdefgh|iiiiiii  with some specified 'i'  常量

2. opencv的实现

opencv中有几处增加边界的实现,其源码分别散布在Utils.cpp,Filter.cpp,Ts_func.cpp中,功能和实现都基本相同。

以Utils的copyMakeBorder,及Filter中的borderInterpolate为例,这两种的代码风格比较通俗易懂。

边界处理的步骤:

   首先,为目的图像(结果图像)分配内存,图像大小为size(src.rows + top + bottom, src.cols + left + right)

    然后,以原图为基准,逐行处理,先扩展左边界,复制原图数据到目的图像,再扩展右边界。

    最后,扩展上边界,以及下边界。

在OpenCV中图像地界扩展 copyMakeBorder 的实现

其中,每扩展一个边界像素,都需要计算出对应的原图中的位置,这个功能被提炼出来,就是borderInterpolate

static void copyMakeConstBorder_8u( const uchar* src, size_t srcstep, Size srcroi,                                    uchar* dst, size_t dststep, Size dstroi,                                    int top, int left, int cn, const uchar* value ){    int i, j;    AutoBuffer<uchar> _constBuf(dstroi.width*cn);    uchar* constBuf = _constBuf;    int right = dstroi.width - srcroi.width - left;    int bottom = dstroi.height - srcroi.height - top;        for( i = 0; i < dstroi.width; i++ ) // 初始化 常量buf的值    {        for( j = 0; j < cn; j++ )            constBuf[i*cn + j] = value[j];    }        srcroi.width *= cn;    dstroi.width *= cn;    left *= cn;    right *= cn;        uchar* dstInner = dst + dststep*top + left;        for( i = 0; i < srcroi.height; i++, dstInner += dststep, src += srcstep ) // 复制原图数据和扩展左右边界    {        if( dstInner != src )            memcpy( dstInner, src, srcroi.width );        memcpy( dstInner - left, constBuf, left );        memcpy( dstInner + srcroi.width, constBuf, right );    }        dst += dststep*top;        for( i = 0; i < top; i++ )        memcpy(dst + (i - top)*dststep, constBuf, dstroi.width); // 扩展上边界        for( i = 0; i < bottom; i++ ) // 扩展下边界        memcpy(dst + (i + srcroi.height)*dststep, constBuf, dstroi.width);}


对于medianBlur( InputArray _src0, OutputArray _dst, int ksize )的边界扩展方式是 重复复制最边缘像素 BORDER_REPLICATE。


热点排行