c++ - 为什么渲染引擎将图像 segmentation 为小方 block ?

标签 c++ c image-processing imaging gil

假设我在内存中有一个图像,它由一个array 或一个std::vector 表示;为了这个例子,我还假设我的图像是 400x300 像素,我想将这个结构 segmentation 为最大 64x64 像素的正方形(或方 block )。

我正在考虑的数组是这样声明的

int a[400*300];

并且喜欢

int a[400][300];

这是 1 个不错的连续内存块。

我的观点是,您始终尽量保持数据结构和对该数据结构的访问尽可能线性。将图像 segmentation 为正方形涉及从 1 行跳到另一行或从 1 列跳到另一列,具体取决于图像在内存中的布局方式。给定图像的大小和尺寸,计算正方形的边界没有问题,但是在这个正方形上表达迭代时,事情变得有点太复杂了,我没有看到使用这种方法有任何真正的好处。

那么为什么这种 segmentation 步骤的解决方案如此受欢迎呢?为什么不只渲染 1 行或 1 列?

最佳答案

内存局部性/缓存一致性。大多数图像处理操作在 2D 中运行,为了高效的内存访问,您希望在 2D 中彼此靠近的像素在内存中彼此靠近。像这样按 block 排列数据意味着,与使用简单的线性布局相比,具有相同 x 坐标和相邻 y 坐标的 2 个像素平均具有更接近的内存地址。

有更复杂的图像布局方式,通常在 GPU 渲染时用于纹理,这平均提供更好的内存局部性。

关于c++ - 为什么渲染引擎将图像 segmentation 为小方 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19873023/

相关文章:

c++ - 函数退出时是否需要清除函数内部声明的STL 'map'?

c++ - 斐波那契数列更快,但起始数不同 (F[n]=F[n-1]+F[n-2])

c - 如何在函数体中使用外部宏?

c - 递归 C 函数

python - 如何识别openCV中的不完整矩形

c++ - 比较 Boost.Bind 返回的对象?

java - 如何以编程方式从被动嗅探中收集数据包?

c - 初始化 union/结构的正确方法是什么?

opencv - 如何在Javacv中将Mat转换为IplImage?

image - 罪恶之城效应