对二维数据进行边界拓展

对二维数据处理的时候,经常遇到需要越界的问题,比如对图像进行滤波操作。对原始数据的边界进行拓展,然后使用拓展后的数据作处理,可以解决越界的问题。根据拓展出的数据的值来自哪里可以分为多种边界拓展方式,我们要实现的是将边界进行奇对称拓展。

算法

举例说明什么是奇拓展。比如对原始二维数据向左拓展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)*S - (a2Min>0? 0:a2Min);
  // copy current bi-level image to the extended image
  for (int r = 0; r < rows; r++){
    memcpy(imExtOrgData + r*S, imData+r*cols, cols*sizeof(io_byte));
  }
}

上面的函数,实现的是将原始二维数据(实际是一维存储在内存里的)放到一个新的内存块中存储,新内存块是添加了拓展边界的内存的。

a1min,表示将原数据向上拓展(a1min<0? -a1min:0)行数据。

a1max,表示将原数据向下拓展(a1max>0? a1max:0)行数据。

a2min,表示将原数据向左拓展(a2min<0?-a2min:0)列数据。

a2max,表示将原数据向右右拓展(a2max>0?a2max:0)列数据。

void abOddFillExtendMemory(unsigned char *imExtData, unsigned char *imExtOrgData,
  const int a1Min, const int a1Max,
  const int a2Min, const int a2Max,
  const int rows, const int cols,
  const int S, const int R)
{

  // vertical direction
  for (int r = a1Min; r < 0; r++){
    memcpy(imExtOrgData + r*S, imExtOrgData - r*S, sizeof(io_byte)*cols);
  }
  for (int r = a1Max; r > 0; r--){
    memcpy(imExtOrgData + (rows-1+r)*S, imExtOrgData + (rows-1-r)*S, sizeof(io_byte)*cols);
  }
  // horizontal direction
  if (a2Min < 0){
    for (int r = 0; r < R; r++){
      for (int ct = a2Min; ct < 0; ct++){
        imExtData[r*S+ct-a2Min] = imExtData[r*S-ct-a2Min];
      }
    }
  }
  if (a2Max > 0){
    for (int r = 0; r < R; r++){
      for (int ct = a2Max; ct > 0; ct--){
        imExtData[r*S+cols-(a2Min<0?a2Min:0)+ct-1] = imExtData[r*S+cols-(a2Min<0?a2Min:0)-ct-1];
      }
    }
  }
}

上面的代码实现的是,对拓展出的边界进行数据填充,具体填充方式,按照奇对称填充规则实现。

总结

二维数据的拓展经常被使用到,特别是图像处理中,使用这段代码,可以减少点开发时间。另外,如果想使用其他拓展算法,可以直接将上面第二个函数的赋值操作修改成想要的规则即可。

时间: 2024-08-28 15:19:15

对二维数据进行边界拓展的相关文章

二维数据名作形参

之前帮同学调一个程序的时候遇到的,把二维数据改为全局变量,不通过参数传递就没问题了,否则程序崩溃. 细究一下,二维数据名用于形参时需要注意哪些方面. 测试程序如下: #include<stdio.h> #include<stdlib.h> void print1(int **a, int m, int n); void print2(int (*a)[2], int m, int n); int main() { int a[2][2]={1,2,3,4}; print1((int

【Excle数据透视】二维数据如何创建数据透视表

二维数据在创建数据透视表的时候,可能会给你带来一些麻烦,没法创建,会丢失维度,那怎么办呢? 解决办法:使用数据透视表和数据透视图向导即可创建 步骤1 按下[Alt+D+P],出现如下界面 选择上图中的"多重合并计算数据区域"→下一步 创建单页字段→下一步 选定区域A:A15→添加→下一步 单击完成 数据透视表已经创建完成.二维数据透视表与一维数据透视表在于"行合计" 注意:我上图的数据透视是使用默认计数,所以全部都是1,这个可以根据自己的需求进行调整.

PHP二维数据排序,二维数据模糊查询

一.因为项目中的一个报表需要合并三个表的数据,所以分表查询再合并数据,利用PHP数组函数进行排序,搜索.三表合并后的数组结构如下: Array ( [0] => Array ( [history_id] => 12 [sla_group_id] => 1 [sla_id] => -1 [create_time] => 1513057695 [tasklog_id] => 12 [tasklog_time] => 2017-12-12 13:48:15 [taskl

TensorflowTutorial_二维数据构造简单CNN

使用二维数据构造简单卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 图像和一些时序数据集都可以用二维数据的形式表现,我们此次使用随机分布的二位数据构造一个简单的CNN-网络卷积-最大池化-全连接 参考代码 # Implementing Different Layers # --------------------------------------- # # We will illustrate how to use different types # of layers

一维数据和二维数据

此文章为本人学习所得,如有不足之处,欢迎指正,分享原创,一起进步 维度:数据的组织形式 一维数据 由对等关系的有序或无序数据构成,采用线性方式(一条直线排开)组织 对等关系:这些数据平级关系(不是包含.从属关系) 一维数据的表示----- 如果数据间有序:使用列表类型.如:一维列表ls = [3.1 , 3.02 , 4.15]如果数据间无序:使用集合类型,如:一维集合st ={ 4.15 , 3.02 , 3.1} 切记:for循环可以遍历数据,进而对每个数据进行处理 一维数据的存储-----

python第七周,二维数据的格式化和处理

二维数据的表示: 类表类型可以表示二维数据 [   [424,23423,2342],[131,535,3646]  ] 使用两层for循环可以便利每个元素 外层列表中每个元素可以对应一行,也可以对应一列 一维数据分为列表和集合类型,二维数据只有列表类型 CSV数据存储格式 国际通用的一二维数据存储格式,一般.csv扩展名,每行一个一维数据,采用逗号分隔,无空行 Excel软件可读入输出,一般编辑软件都可以产生,如果某个元素缺失,逗号仍要保留, 二维数据的表头可以作为数据存储,也可以另行存储,

关于二维数据中的一维指针作为函数参数和返回值

问题描述: 1 假定定义了一个二维数组用来存放多条(总20条)数据,每条数据长度为10,uchar message[20][10] 2 要将外部来的一条数据存放到缓冲区指定位置(入口参数 uchar *p,数据的开始地址) 3 要从缓冲区读出一条记录,将其输出(出口参数 uchar *p,数据的开始地址). 那么该怎么写2个函数的形参/return值/返回值类型 答案: void sendbuf(uchar a[10]) { ...将a[0]~a[9]的值拷贝到指定缓冲区buf[i][0~9]

php对二维数据进行排序

PHP一维数组的排序可以用sort(),asort(),arsort()等函数,但是PHP二维数组的排序需要自定义. 方法一:(经验证,成功) 作用:对二维数组进行指定key排序 参数:$arr 二维数组 ,$shortKey 需要排序的列,$short 排序方式 $shortType 排序类型 function multi_array_sort($arr,$shortKey,$short=SORT_DESC,$shortType=SORT_REGULAR) { foreach ($arr as

二维数据练习--矩阵的加法和乘法

数组的练习示例展示: package arrayList; /** * 矩阵的集中运算法则:求和,求积,求逆矩阵,转置矩阵...... * @author Drew * */ public class Arrays { /** * 两个二维数组(矩阵)求和. * @param a 矩阵(二维数组) * @param b 矩阵(二维数组) * @return 返回一个矩阵(二维数组) */ public static int[][] add(int [][] a,int [][] b) { int