1

我尝试使用 Halide 编写简单的图像计算程序。所以我从亮度功能开始。

我懂了

Halide::ImageParam img(Halide::type_of<float>(), 3);
img.set_stride(0, 4);
img.set_stride(2, 1);
Halide::Func f;
Halide::Var x, y, c;
Halide::Param<float> brightnesMod;

f(x, y, c) = img(x,y,c) * brightnesMod;

f.vectorize(x, 16).parallel(y);

auto & obuff = f.output_buffer();
obuff.set_stride(0, 4);
obuff.set_stride(2, 1);
std::vector<Halide::Argument> arguments = { img, brightnesMod };
f.compile_to_file("function", arguments);
return 0;

但后来我有一个问题。我的图像是 RGBA 图像,所以我用 alpha 计算算法。如何跳过它,并更改 f(x,y,c) 以使 c 仅为 0-2?

4

2 回答 2

1

这意味着您希望 c 的输出范围为 3。它与任何其他维度相同:它具有最小值和范围。您的输入是 RGBA,所以 4 个通道 - 它的 c 范围是 4。

将产生多少个颜色通道,取决于您在调用管道时请求的范围。

你可以使用:

obuff.set_extent(c, 3);

如果您想强制频道数量为 3,如果您尝试请求多于或少于 3 个频道,则会导致错误。

于 2016-07-03T18:35:39.923 回答
0

正如 Sander 所说,您只需要求第 3 个维度的范围为 3 而不是 4,在这种情况下,通过传入该维度中范围为 3 的输出缓冲区。如果您只需要一个 3 通道输出缓冲区,您可能还希望将颜色通道上的步幅设置为 3(在您的示例中为 set_stride(0,3),因为您似乎需要交错的 RGB 数据)。如果您想要一个 RGBA 输出缓冲区但在计算过程中忽略了 alpha,您可以将步幅保留为 4,但将范围设置为仅 3。

另一个注意事项:使用平面存储而不是交错存储将为您在 x 维度上进行矢量化提供更好的性能,就像您在此处所做的那样。一般来说,向量化(到目前为止)在最里面/最密集的存储维度上效果最好,特别是对于这么简单的计算。

于 2016-07-04T13:35:23.237 回答