对二维数据处理的时候,经常遇到需要越界的问题,比如对图像进行滤波操作。对原始数据的边界进行拓展,然后使用拓展后的数据作处理,可以解决越界的问题。根据拓展出的数据的值来自哪里可以分为多种边界拓展方式,我们要实现的是将边界进行奇对称拓展。
算法
举例说明什么是奇拓展。比如对原始二维数据向左拓展4列,那么在边界上向左第一列复制边界上向右第一列,在边界上向左第二列复制边界上向右第二列,以此类推。边界列并没有被复制,因为C语言中是从0开始计数的,所以边界列是0列,按照0列对称拓展就称为奇对称拓展。如果0列被复制到左拓展的第一列,1列被复制到向左拓展的第二列,那么这种拓展方式成为偶拓展。
代码
对二维数据进行奇拓展的代码片段如下:
void abExtendMemory(unsigned char *&imExtData, unsigned char *&imExtOrgData,
int &S, int &R,
const int rows, const int cols, const io_byte *imData,
const int a1Min, const int a1Max,
const int a2Min, const int a2Max)
{
S = cols + (a2Max>0? a2Max:0) - (a2Min<0? a2Min:0);
R = rows + (a1Max>0? a1Max:0) - (a1Min<0? a1Min:0);
imExtData = new io_byte[(R)*(S)];
imExtOrgData = imExtData - (a1Min>0? 0:a1Min