Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Разбить картинку на одноцветные прямоугольники


Автор: Michael.de 22.10.2009, 19:08
Всем привет smile

Постановка задачи: Существует картинка - прямоугольник со сторонами N и M, изначально составленная из элементарных квадратов (1x1). Каждый квадрат имеет свойство:цвет. Квадраты в прямоугольнике расположены как ячейки в таблице (другая аналогия: картинка и её пиксели). Я пытаюсь написать/найти алгоритм, который уменьшает общее кол-во (а лучше - находит минимум) квадратов, "склеивая" их в прямоугольники (конструкции вида Г или Т создавать нельзя). Условие склеивания: одинаковый цвет. Т.е. чем из меньшего числа прямоугольников и квадратов будет в конце состоять наша "картинка", тем лучше. Понятно что найдутся неоптимизирующиеся прямоугольники: user posted image

Простейший алгоритм: пробежаться в цикле построчно (или по столбцам) и "склеивать" соседей, если они одноцветны. Но мне почему-то кажется, что существует "двумерный" алгоритм (из квадратов образуются как горизонтальные так и вертикальные прямоугольники). Его и пытаюсь найти

Вопрос: Может кто знает название подобного алгоритма (или ссылку на аналогичное)? Заранее спасибо smile

Автор: Lipetsk 23.10.2009, 07:51
ваша задача сводится к нахождению минимального разбиения прямоугольного многоугольника на прямоугольники

Автор: Michael.de 23.10.2009, 22:28
Lipetsk, а что это за задача и где можно найти информацию о алгоритме её решения?

P.S. 
Цитата(Lipetsk @  23.10.2009,  07:51 Найти цитируемый пост)
...прямоугольного многоугольника...
"прямоугольный многоугольник"... хм, а разве не проще называть эту конструкцию прямоугольником? Или прямыми считаются также внешние углы и крест тоже к ним относится? (правда это уже не мой вопрос)

Автор: Sanaff 24.10.2009, 15:45
Michael.de
Вам примерно так надо?
http://narod.ru/disk/14429643000/Compare_color_rect.rar.html
Прога ищет прямоугольники, больише чем 1х1
 см. личку.

Автор: Michael.de 25.10.2009, 23:45
Sanaff, эээ... а где она их ищет? И это... я - параноик (*.exe из интернета не открываю). Может просто на словах принцип работы скажешь? А кодировать я уж сам smile

Автор: Sanaff 26.10.2009, 20:11
Прога ищет однотонные прямоуглольники на изображении, состоящем из поля разноцветных точек и нескольких прямоугольников разных цветов. Во всяком случае, подходит к твоему заданию.
Алгоритм: пробег по столбцу (по y), поиск "линий" (смежных точек) с одинаковым цветом. Для каждой такой линии смотрим весь список найденных прямоугольников. если есть прямоугольник с началом, равным началу линии и с высотой, равной длине линии и он по х заканчивается как раз на предыдущем столбце, то добавляем линию к этому прямоугольнику. Иначе - это начало нового прямоугольника (высотой = длине линии, шириной=1)
Какой-то жуткий текст получился 0_0. Скачай прогу и посмотри. Проверяй антивирусниками, а специально вирусы никто слать не станет. Я просто доверяю всему, что присылают форумчане.

Автор: Michael.de 26.10.2009, 23:53
Sanaff, твой алгоритм найдёт 2 синих прямоугольника до красной линии и 2 после неё? И то же, если его повернуть на 90° или зеркально "отсимметрить"? Просто я считаю, что от перемены расположения прямоугольника в пространстве не должно меняться конечное решение (нахождение минимума одноцветных прямоугольников)
••••••••
••••••••
••••••••
••••••••
••••••••
••••••••


P.S. И это ещё очень простой пример smile

Автор: Sanaff 27.10.2009, 14:26
Michael.de
Нет, мой алгоритм найдёт 2 вверху и 3 внизу.если повернуть - то по-другому. Я и не говорил, что это оптимальный алгоритм. И вообще, поиск минимального числа чего-то - это раздел интеллектуальных задач, где алгритмы не такие простые.
Может помочь поиск и выделение прямоугольников сначала в одном направлении, потом в другом (на 90°)
Пример:

000000000                      
0000*****
00*****00
000000000

можно представить:

000000000                      
000022233
001122200
000000000   - так 3 прямоугольника (направление по Y)
  или:
000000000                      
000011111
002222200
000000000   - так  2 прямоугольника (направление по Х)

Как организовать выбор направления поиска, чтобы было минимальное число прямоугольников - пока не знаю. всю картинку поворачивать - смысла нет. надо вести 2 (или 4) направления анализа для каждой точки. Приоритетное направление - где линия от этой точки продолжается дольше. ИМХО.

Автор: Michael.de 27.10.2009, 19:37
Цитата(Sanaff @  27.10.2009,  14:26 Найти цитируемый пост)
...всю картинку поворачивать - смысла нет...
Эээ... я вообще хотел бы уйти от этого примера с графическим файлом (*.png, *.jpg или *.gif). Мне нужен алгоритм (или направление для его поиска) без привязки к какой-либо практической задаче. Хотя использовать картинку (но только в качестве примера!) очень удобно и наглядно smile

Автор: kamre 28.10.2009, 01:51
Можно начать отсюда: http://www.cise.ufl.edu/~sahni/papers/part.pdf

Автор: x128 28.10.2009, 11:23
для решения возможно подойдет квадродерево(quadtree)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)