我有一个使用 int 存储图像数据的二维数组。此时它是 800x640,但可以更改。我想将它传递给 8x8 block 中的另一个函数进行处理。实际上,我可以将数组的一个 8x8 block 复制到一个临时变量中并将其发送到函数,然后将结果复制到另一个 800x640 数组中。
但是,如果我在这个 800x640 数组中给它起始 xy 坐标,我希望该函数能够直接访问 8x8 block (这会更快)。问题是使用 int** 不起作用。声明为 int[8][8] 的参数也不会编译。我该怎么办?现在我正在用 C++ 编写程序,但最终也必须用 C 编写。
最佳答案
您可以将指向原始图像的指针和其他参数提供给函数,并访问函数内 8x8
区域的每个元素。
假设这是您的原始 800x640
图片:
int img[640][800];
声明你的函数为:
void work_on_roi(int* img, size_t img_width, size_t img_height, int roi_x, int roi_y, size_t roi_width, size_t roi_height)
ROI 代表感兴趣区域,是图像处理领域中广泛使用的术语。在您的情况下,如果您想使用 (10,20)
作为其左上角索引访问 roi,您可以使用以下参数调用此函数:
work_on_roi(img, 800, 640, 10, 20, 8, 8)
在这个函数中,访问 roi 中的 (i,j)
元素将是:
(img + (roi_y + j) * img_width)[roi_x + i]
您可以使用 roi_width
和 roi_height
参数来检查完整性:
// before accessing (i,j) element of roi
assert(i < roi_width);
assert(j < roi_height);
assert(roi_x + i < img_width);
assert(roi_y + j < img_height);
关于c - 如何发送大二维数组的 block 以进行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44578569/