2016-07-18 2 views
0

Я пытаюсь создать программу, соответствующий шаблон, который использует следующую формулу для определения соответствия между шаблоном и изображением:выхода сдвинут в шаблоне сопоставления

formula

мой код выглядит следующим образом:

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()); 

После выполнения следующего кода результат изображение смещено, как в примере:

Исходное изображение: Original image

Шаблон: 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

ваше решение делает работу (за исключение я должен был удалить первоначальный 'сравнения (х, у) = предел (х, у) 'части), но можете вы пожалуйста объясните, почему вы делите сумму с продуктом размеров шаблона? – 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); 
Смежные вопросы