現在我正在嘗試編寫一些子樣本圖像的Halide代碼。基本上我希望每個2×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來表示一些範圍內的減少操作。然而,在沒有任何例子中,我發現你是否可以將一個變量傳遞給一個隨機域對象。
編輯:
鹵化物玩弄多一些之後,我能夠構建這樣的:
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的最大減少。但是,當我把它放在循環中時,它不會被調用,因爲它不能被定義。無論如何要把這一點放在域名減少方面?