Код: Выделить всё
#pragma omp parallel for
for(y = 0; y < h-1; y++){
int x;
unsigned char *in = levels + y*w, *out = mask + y*(w-1);
unsigned char m, a,b,c,d;
for(x = 0; x < w-1; x++, in++, out++){
a = *in, b = *(in+1), c = *(in+w), d = *(in+w+1);
m = MIN(MIN(a,b), MIN(c,d));
*out = ((a!=m)<<3) | ((b!=m)<<2) | ((d!=m)<<1) | (c!=m);
}
}Все это работает достаточно быстро (~160мс на изображении 3000x3000).
А вот с реализацией распознавания и сохранения контуров возникло непонимание:
- Непонятно, как однопроходным алгоритмом распознать все контуры (или все-таки использовать стандартный подход и сканировать все пиксели изображения, в случае обнаружения контура проходить по контуру, обнуляя значения в уже просмотренных пикселях, возвращаться и сканировать дальше?). Еще вариант - взять "распознавалку" из лептоники, но там на выходе получится очень много данных.
- Непонятно как замыкать контуры и "проскакивать" разрывы. Особенно если на каком-либо пикселе сходится несколько изолиний (скажем, резкий контрастный край).
- Как сохранять обнаруженные изолинии. Я себе представляю это как массив структур. Индекс элемента массива соответствует очередному уровню интенсивности, а сам элемент - список обнаруженных изолиний. Каждый элемент списка в свою очередь является списком координат точек изолиний, полученных линейной интерполяцией из метода "шагающих квадратов". Нормально это, или можно сделать более осмысленное хранение?
Прошу совета. Может, кто-нибудь сталкивался с реализацией данного алгоритма...
P.S. Вот наброски алгоритма.