不能在图像中计算alpha

Not able to compute alpha in image

本文关键字:计算 alpha 图像 不能      更新时间:2023-10-16

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

I got this

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?

这意味着您希望c的输出范围为3。和其他维度一样,它有最小值和范围。你的输入是RGBA,所以4通道-它的c范围是4。

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

你可以使用:

obuff.set_extent(c, 3);

如果你想强制通道数为3,如果你尝试请求多于或少于3个通道,将会导致错误。

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

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