为什么2D图像有时被建模为指针(T **)的指针?

时间:2015-10-27 11:47:44

标签: c++ c arrays pointers image-processing

某些图像数据结构实现使用指向指针的指针(例如T**)。第一个指针指向数据的行/列,第二个指针指向行/列中的数据元素。

与指向数据的单个指针(例如T*)相比,此数据结构有什么优势?

我意识到这是一个广泛的问题,因此我将问题缩小到C ++和C编译器的现代工作(“最低公分母”)。

2 个答案:

答案 0 :(得分:3)

使用T**

的优点
  • 元素索引的更自然语法(a[i][j]而不是a[i * width + j]

  • 不需要乘法进行索引(低端CPUS上的乘法仍然很昂贵,例如微控制器)

  • 可能更适合您可能正在使用的任何第三方或旧版API

  • 适用于非矩形图像(即每行的宽度可能不恒定)

  • 当你进行邻域操作时,
  • 可以使边框处理更容易(在图像的开头/结尾定义额外的行,这些行是反射行索引的别名)

  • 允许针对效率优化行对齐,例如使用SIMD时(即使图像宽度不方便,也可以使每行SIMD对齐)

请注意,如果您分配如下图像,则可以拥有“两全其美”:

T* image_buffer = malloc(height * width * sizeof(T)); // allocate "flat" image
T** image = malloc(height * sizeof(T*));              // allocate row pointers
image[0] = image_buffer;                              // init row pointers
for (int i = 1; i < height; ++i)
    image[i] = image[i - 1] + width;

通过这种方式,您可以获得连续的图片image_buffer,可以image[i * width + j]访问,也可以将其视为T**图片,可以image[i][j]进行访问}。当您有不同的API期望不同格式的图像数据时,这可能很有用。对于T**图像来说,它比每行使用一个malloc的天真方法更有效。

答案 1 :(得分:1)

1)您可以通过(x,y)坐标引用点,而不是计算一维数组中的相应索引。 (uchar **可以用作uchar [x] [y])

2)你可以简单地使用例如完整的行/列。通过将行/列的相应指针(应该使用)传递到操作中来进行向量操作。