Помимо переполнения стека, у вас есть еще одна проблема - та, которая маскируется вашими определениями W и H.
for(int i=0;i<W;i++)
for(int j=0;j<H;j++)
{
if(img[i*W+j]==0)
dtr[i*W+j] = 0; // <------here
else
dtr[i*W+j] = MAX; // <------here
}
Ваш цикл i должен считать от 0 до H-1, а не W-1 (и цикл j также должен поменяться местами). В противном случае ваш код будет работать правильно, только если W == H. Если WH, то вы переполните свои буферы.
Эта же проблема существует и в других местах вашего примера кода.