Задать вопрос
@krox
аспирант, программист, исследователь

Как разделить содержимое монохромного изображения на отдельные файлы?

Собственно, есть некоторое изображение (bmp/jpg/png) которое содержит в себе некоторое количество объектов с ломанными границами. Объекты находятся на изображении как угодно (могут находиться очень близко друг к другу), но не пересекаются.
ce709da9f87840ccbdcf16c8318521c7.png

Стоит задача программно разбить это изображение на множество других изображений, каждое из которых будет содержать в себе отдельные монохромные элементы.

Какие алгоритмы можете посоветовать?
Может есть что-то в OpenCV, что позволит узнать координаты крайних точек (x1,y1,x2,y2) и уже с помощью, например, QImage->copy скопировать выбранный фрагмент и из QImage сохранить его (передать другому компоненту).

P.S> В размышлениях придумал вариант заносить данные в двумерный массив (черный цвет - 0, белый - 1) и уже из него каким-то образом выделять группы нулей и записывать их ещё куда-нибудь. Соответственно, из куда-нибудь опять превращать в файл и сохранять (работать далее с ним). Что может быть лучше этого варианта?
  • Вопрос задан
  • 3942 просмотра
Подписаться 2 Оценить Комментировать
Ответ пользователя Odissey Nemo К ответам на вопрос (6)
@odissey_nemo
Программист, ГИС-системы, растры, космоснимки
Берётся любой алгоритм заливки одноцветного растрового полигона любым цветом, начиная с любой его точки заданного цвета. Они были ещё под ДОС заготовлены в любом растровой библиотеке (в том-же Борланде).

1. Ищется слева направо сверху вниз первая точка нужного цвета. Если не найдена - выход. Иначе на 2.
2. Точка запоминается на будущее. Начиная от найденной точки, заливается полигон, включающий её каким-либо рабочим цветом (алгоритмом заливки).
3. Определяются bounding box (экстенты) этого найденного полигона (top Y уже известен - как у первой точки) в растровой системе координат. Создаётся растр этого размера (или чуть расширенный для красивых границ). В него перегоняется найденный полигон.
4. Сохраняется найденный полигон в файл.
5. Из оригинального изображения устраняется найденный полигон. Скажем, методом той же заливки, но уже цветом отсутствия. Или вариацией операции XOR по цвету заливки.
6. Начиная с запомненной точки, ищется следующая точка нужного цвета.
7. Если найдена, на шаг 2.
8. Если не найдена, выход.

Не ясным пока остаётся поиск экстентов (Bounding box, BB). Самое простое - сканировать каждый раз весь исходный растр, что не комильфо. Или как-то модифицировать алгоритм заливки - с запоминанием экстентов. Что достаточно просто. И залил и экстенты получил за один раз.
Ответ написан
Комментировать