2016-07-18 3 views
0

テンプレートマッチングにシフト出力は、私は、テンプレートと画像との間の適合を決定するには、次の式を使っているテンプレートマッチングプログラムを作成しようとしています

オリジナル画像:結果画像は例のようにシフトされ、次のコードを実行した後

Halide::Var x, y, xt, yt; 
Halide::RDom r(0, t.width(), 0, t.height()); 
Halide::Func limit, compare; 
limit = Halide::BoundaryConditions::constant_exterior(input,255); 
compare(x, y) = limit(x,y); 
compare(x, y) = Halide::cast<uint8_t>(Halide::pow(t(0 + r.x, 0 + r.y) - limit(x + r.x, y + r.y),2)); 

Halide::Image<uint8_t> output(input.width(),input.height()); 
output = compare.realize(input.width(),input.height()); 

テンプレート:Template

結果:Result

がどのようにシフトするからイメージを防ぐことができますか?

答えて

1

トンと入力の種類が何であるかを確認しますので、オーバーフローする可能性がある次が、私はあなたが何かしたいとは思いません:

Halide::Var x, y, xt, yt; 
Halide::RDom r(0, t.width(), 0, t.height()); 
Halide::Func limit, compare; 
limit = Halide::BoundaryConditions::constant_exterior(input,255); 
compare(x, y) = limit(x,y); 
compare(x, y) = Halide::cast<uint8_t>(sum(Halide::pow(t(r.x, r.y) - limit(x + r.x - t.width()/2, y + r.y - t.height()/2),2))/(t.width()*t.height())); 

Halide::Image<uint8_t> output(input.width(),input.height()); 
output = compare.realize(input.width(),input.height()); 
+0

私の最初の 'compare(x、y)= limit(x、y)'部分を削除しなければならなかったのですが)なぜ合計をテンプレートの次元の積で割っているのか説明してください。 – Rok

1

ても何の合計はありません。テンプレート画像の右下のピクセルの二乗差だけを保存しています。

Halide::Var x, y, xt, yt; 
Halide::RDom r(0, t.width(), 0, t.height()); 
Halide::Func limit, compare; 

// There's no point comparing the template to pixels not in the input. 
// If you really wanted to do that, you should start at 
// -t.width(), -t.height() and wd, ht will be plus the template size 
// instead of minus. 
int wd = input.width() - t.width(); 
int ht = input.height() - t.height(); 

// constant_exterior returns a Func. 
// We can copy all dimensions with an underscore. 
limit(_) = Halide::BoundaryConditions::constant_exterior(input,255)(_)/255.f; 

Func tf; 
tf(_) = t(_)/255.f; 

// Not necessary now and even so, should have been set to undef<uint8_t>(). 
// compare(x, y) = limit(x,y); 

// Expr are basically cut and pasted to where they are used. 
Expr sq_dif = Halide::pow(tf(r.x, r.x) - limit(x + r.x, y + r.y), 2); 
Expr t_count = t.width() * t.height(); 
Expr val = Halide::sum(sq_dif)/t_count; 

compare(x, y) = Halide::cast<uint8_t>(Halide::clamp(255 * val, 0, 255)); 

// The size of output is set by realize(). 
Halide::Image<uint8_t> output; 
output = compare.realize(wd, ht); 
関連する問題