某些图像数据结构实现使用指向指针的指针(例如T**
)。第一个指针指向数据的行/列,第二个指针指向行/列中的数据元素。
与指向数据的单个指针(例如T*
)相比,此数据结构有什么优势?
我意识到这是一个广泛的问题,因此我将问题缩小到C ++和C编译器的现代工作(“最低公分母”)。
答案 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)你可以简单地使用例如完整的行/列。通过将行/列的相应指针(应该使用)传递到操作中来进行向量操作。