2015-04-14 35 views
1

現在我正在嘗試編寫一些子樣本圖像的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的最大減少。但是,當我把它放在循環中時,它不會被調用,因爲它不能被定義。無論如何要把這一點放在域名減少方面?

回答

1

尋找更多的後成鹵化物,我意識到我可以得到我想要這個:

Halide::Func subsample; 
Halide::Var x, y, c; 

Halide::RDom r(0, size, 0, size); 

subsample(x, y, c) = input(size * x, size * y, c); 
subsample(x, y, c) = Halide::max(input(size*x + r.x, size*y + r.y, c), 
    subsample(x,y,c)); 
0

我覺得你只是想要一個更簡單的純函數的定義(沒有C++循環,這不這樣做,我認爲你期望他們做...;沒有RDoms):

// using Halide::max 
subsample(x,y,c) = max(max(input(2*x,2*y ), input(2*x+1,2*y )), 
         max(input(2*x,2*y+1), input(2*x+1,2*y+1))); 
2

我覺得argmax(這是嵌入式金滷燈功能),可用於你想要什麼:)

#include "Halide.h" 
#include <stdio.h> 

uint8_t data[16] = { 
    1, 2, 3, 4, 
    5, 6, 7, 8, 
    9, 0, 1, 2, 
    3, 4, 5, 6 
}; 

using namespace Halide; 

int main(int argc, char** argv) { 
    Halide::Image<uint8_t> input(4, 4); 
    for(int j = 0; j < 4; j++) { 
     for(int i = 0; i < 4; i++) { 
      input(j, i) = data[j*4 + i]; 
     } 
    } 

    Halide::Func f, max2x2; 
    Halide::Var x, y, dx, dy; 
    Halide::Expr x_ = x * 2; 
    Halide::Expr y_ = y * 2; 

    f(x, y, dx, dy) = input(x_ + dx, y_ + dy); 

    RDom r(0, 2, 0, 2); 
    max2x2(x, y) = argmax(f(x, y, r.x, r.y))[2]; 

    Halide::Image<uint8_t> output(2, 2); 
    max2x2.realize(output); 

    for(int j = 0; j < 2; j++) { 
     for(int i = 0; i < 2; i++) { 
      printf("%d ", output(j, i)); 
     } 
     printf("\n"); 
    } 
    return 0; 
}