Есть ли алг-ты для соединения единичек бинарного изображения в полигоны?
Не могу найти на этом сайте. А то свой щас придумаю!
Здравствуйте, gok, Вы писали:
gok>Есть ли алг-ты для соединения единичек бинарного изображения в полигоны?
Ты про
этоАвтор: Кирилл Осенков
Дата: 28.09.03
?
gok>Не могу найти на этом сайте. А то свой щас придумаю!
Придумывай, конечно, потом обсудим
Здравствуйте, FreshMeat, Вы писали:
FM>Ты про это?
Ага, оно. Те же яйца, но под другим соусом (т.е. формулировкой). Спасибо!
Здравствуйте, FreshMeat, Вы писали:
FM>Придумывай, конечно, потом обсудим
Мда, покрутился там, ничего не понял. Какие то обходы вширину, вглубину...
Похоже там решают след шаг: как эту ломаную упростить.
Выдал свой, все-таки. Простейший как валенок.
Код (ввиде .м) очень сырой, смотрится ужасно некрасиво, должно быть много ускорений. Например, мона как то разбить область на две половинки, верхняя и нижняя и проходить их раздельно. Иначе каждый пиксель одной половины проверяется 3 раза когда идем по пикселям другой половины.
Проверил на своих изображениях – работает. Может обходить односвязные невупыклыи изображения.
Ограничения: 8-связные пиксели, линия 1 пиксель шириной (иначе вектор может завернуть обратно по той же линии!).
Дальнейшие планы: подключить распознание дырок внутри полигонов (например, на снимке было озеро).
Основная идея: отсортировать по колонкам (например) и искать ближайших соседей (+-1) пикселя в 3х колонках (та же что и для пикселя + 2 прилегающие слева, справа). Нашли – бросаем текущий пиксель на выход, затирая его в исходном массиве, новый берем за текущий. Если нет – если это не конец (+-1 пиксель от начала), то зашли в тупик (см ниже типичный случай): затираем текущий и выбираем предыдущий пиксель из выхода в качестве текущего.
Заодно можно проверять изменения направления пикселя для удаления длинных линейных цепочек, но решил сделать это позже на этапе сглаживания полученного вектора.
Пример исходного массива пикселей и тупика (видны номера шагов):
* 0 0 * 1 0 0 *
* 0 0 * 2 0 0 *
0 * * * 0 3 4 5
0 0 * 0 0 0 6 0