matlab的边界填充(padarray)和opencv的边界填充(cvCopyMakeBorder)
首先,先说一下opencv中的cvCopyMakeBorder()函数:
cvCopyMakeBorder(src,dst,cvPoint(m,n),bodertype,value)
cvPoint(m,n):的意思是以src(即原矩阵)的左上角点为坐标原点,dst(即目标矩阵)相对于src的左上角点向外扩展的列行数。注意m代表列数,n代表行数。这里的m列和n行虽然是指相对于左上角的行列数,但是,扩充时上下都扩充n行,左右都扩充n列,所以整个目标矩阵的大小就变成cvSize(src->height+2m,src->width+2n)。这里的大小应为最小,如果目标矩阵的大小大于它,则大于的的部分都加到右下的行列上。
Bodertype:是指扩充边界的方式,包括的方式有如下几种:常量、镜面反射、复制、反射101。
- BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh 复制
- BORDER_REFLECT: fedcba|abcdefgh|hgfedcb 镜面反射
- BORDER_REFLECT_101: gfedcb|abcdefgh|gfedcba 反射101。
- BORDER_CONSTANT: iiiiii|abcdefgh|iiiiiii with some specified ‘i’ 常量
举例说明
测试程序:
int p = 2;
float mat[2][2] = { 1, 2, 3, 4 };
CvMat matrix = cvMat(2, 2, CV_32F, &mat);
CvMatdst = cvCreateMat(matrix.rows+2p, matrix.cols+2*p,CV_32FC1);
cvCopyMakeBorder(&matrix, dst, cvPoint(p, p), IPL_BORDER_CONSTANT);//上下左右都向外扩充2行2列,
测试结果如下:

改变为cvPoint(1,1)向外扩充一行一列,不改变目标矩阵的大小,其余行列则加在右下的行列上,结果如下:

上面的函数cvCopyMakeBorder是opencv的C语言接口函数,而opencv的C++接口函数是copyMakeBorder,函数定义为copyMakeBorder(src,dst,top,bottom,left,right,bodertype,value),没有了cvpoint(),但是很明了,就是上下左右扩充的行列数,读者自行实验。
其次,opencv函数和matlab中的做一下对比,
测试程序
A=[1 2; 3 4];
padarray(A(:, : , 1), [2 2], ‘both’)
测试结果:

结论:opencv的边界扩充可以和matlab的边界扩充函数取得相同的效果。
本文详细解析了OpenCV中的cvCopyMakeBorder函数与MATLAB中padarray函数的使用方法及边界填充效果对比。介绍了cvCopyMakeBorder的参数设置,包括行列扩展、边界类型如复制、反射等,并通过实例展示了不同参数下的边界填充效果。
5244

被折叠的 条评论
为什么被折叠?



