现在我正在尝试编写一些对图像进行二次采样的卤化物代码。基本上,我希望将图像的每 2 x 2 平方缩小为一个包含最大值的像素。一个简单的例子是转换
1 2 3 4
5 6 7 8
9 0 1 2
4 3 5 6
进入
6 8
9 6
现在我正在尝试一些类似的东西(我知道这会给出总和而不是最大值,但这是同一过程的一个玩具示例):
Halide::Image<uint8_t> input = load<uint8_t>("test.png");
Halide::Image<uint8_t> output(input.width() / 2, input.height() / 2, input.channels());
Halide::Func subsample;
Halide::Var c;
for (int i = 0; i < input.height(); i += 2) {
for (int j = 0; j < input.width(); j += 2) {
Halide::RDom r = Halide::RDom(i, 2, j, 2);
subsample(i, j, c) += input(r.x, r.y, c);
}
}
subsample.realize(output);
save(output, "test.png");
但是,此代码无限运行。(我不确定为什么)。我知道我可以使用 Halide::RDom 来表示某个范围内的 reduce 操作。但是,在任何示例中,我发现您不能将变量传递给随机域对象。
编辑:
在玩了一些 Halide 之后,我能够构建这个:
subsample(x, y, c) = Halide::max(input(2*x,2*y,c),input(2*x+1,2*y,c));
subsample(x, y, c) = Halide::max(subsample(x,y,c),input(2*x,2*y+1,c));
subsample(x, y, c) = Halide::max(subsample(x,y,c),input(2*x+1,2*y+1,c));
最大减少 2x2。但是,当我把它放在一个循环中时,它不会调用,因为它不能被定义。无论如何,这是否可以减少域?