无法在图像中计算alpha

时间:2016-07-03 15:27:29

标签: c++ image image-processing halide

我尝试使用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?

2 个答案:

答案 0 :(得分:1)

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

将生成多少个颜色通道,具体取决于调用管道时请求的范围。

您可以使用:

obuff.set_extent(c, 3);

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

答案 1 :(得分:0)

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

另一个注意事项:使用平面存储而非交错存储将为您在x维度上进行矢量化提供更好的性能,就像您在此处所做的那样。通常,矢量化(到目前为止)最好地在最内层/最密集的存储维度上工作,特别是对于这种简单的计算。