|
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 19
|
|
.NET 3.x Разбиение битмапа на минимально возможное количество областей17.06.2013, 15:45. Показов 1860. Ответов 20
Метки нет (Все метки)
Всем доброго времени суток! Мой вопрос может кому то показаться немного нубским, может быть "школьного уровня", но тем не менее. У меня есть некий точечный рисунок, в котором пиксели формата ARGB 32 используют канал Alpha как логическую переменную по сути. то есть либо пиксель 100% непрозрачен либо его вообще не видно. Нужно написать функцию, которая вернет на основе битмапа массив прямоугольных областей (хоть стандартные Rectangle), так, чтобы области покрывали все непрозрачные пиксели, не содержали прозрачных и их было минимальное количество. Прямоугольники могут иметь общие пиксели. Т.е один и тот же пиксель может относится к множеству прямоугольников, но в любом случае - как минимум к одному. Хотелось бы узнать хотя бы на словах алгоритм. В идеале можно и кодом, если не влом. Заранее спасибо. Только не шлите в поисковики. Даже если у такого рода алгоритма есть конкретное название (вдруг) - пожалуйста, опишите своими словами.
0
|
|
| 17.06.2013, 15:45 | |
|
Ответы с готовыми решениями:
20
Разбиение невыпуклого многоугольника на минимально возможное количество выпуклых многоугольников Определить минимально возможное количество игроков в команде КВН Вычеркнуть минимально возможное количество чисел так, чтобы оставшиеся шли в порядке возрастания |
|
Master of Orion
|
|
| 17.06.2013, 16:14 | |
|
GDev, если я правильно понял, то вы просто ищете первый попавшийся закрашенный пиксель, если у него есть соседи, то рекурсивно проверяете этих соседей, пока не упретесь в стенку (то есть "коробку" из незакрашенных пикселей"). Все проверенные точки естественно забиваете в список, состоящий из этих областей. Каждая область - массив структур X Y - точек. Вместо массива есть смысл использовать HashSet
1
|
|
|
189 / 189 / 38
Регистрация: 11.04.2009
Сообщений: 497
|
|
| 17.06.2013, 16:33 | |
|
IMO, можно рассмотреть стратегию: начиная с некоторого пикселя, предположить, что это и есть ваша текущая выбранная область размером 1x1, после чего попытаться ее "расширить", и так, пока такое расширение будет возможно. Затем выбираем следующий начальный пиксель и прогоняем алгоритм еще раз.
Самое сложное будет в расширении - в зависимости от стратегии (например, 1x1 расширяется в 2x1 на соседний пиксель вправо, затем в 2x2 вниз и т.д., т.е. на каждом шаге есть 4 направления расширения, и от этого будет зависеть размер итоговой области). Вариант - слепой перебор кобинаций возможностей расширений пока не будет получена максимальная область.
1
|
|
|
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 19
|
|
| 17.06.2013, 16:38 [ТС] | |
|
Psilon, ну я так и хотел в принципе. Но мне бы хотелось чтобы выходных объектов было как можно меньше. т.е. покрыть непрозрачные пиксели наиболее оптимальным образом. Абы как покрыть тоже вариант, но таких битмапов будет N и объекты будут впоследствии обрабатываться в реальном времени, поэтому количество прямоугольников в рамках задачи принципиально. Весь вопрос прежде всего в этом.
Добавлено через 3 минуты Я так думаю стоит составить все возможные прямоугольники (хоть это и жестко, изображения могут быть весьма большие по кол-ву пикселей), рассортировать по площади, и далее по порядку отбирать самые крупные пока не покроем все пиксели. Такова идея? Нет, это конечно вариант, но достаточно ли он оптимален по ресурсам/времени?
0
|
|
|
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 19
|
|
| 17.06.2013, 17:00 [ТС] | |
|
Ладно, спасибо! Попробуем
![]() Добавлено через 15 минут Имеет ли смысл брать в качестве начальных пикселей только пиксели, которые заведомо лежат на границе прозрачных и непрозрачных (т.е. имееют хотябы одно общее ребро с прозрачными пикселями или лежат на границе изображения)? Или необходимо перебирать все непрозрачные?
0
|
|
|
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 19
|
|
| 17.06.2013, 17:04 [ТС] | |
|
Это понятно, имеет ли смысл при этом пропускать пиксели, лежащие в толще, и брать только граничащие с прозрачными? или это будет ошибкой?
0
|
|
|
Master of Orion
|
|||||||||||
| 17.06.2013, 17:10 | |||||||||||
|
То есть
Если че, это псевдокод, тут ошибки
0
|
|||||||||||
|
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 19
|
|
| 17.06.2013, 17:17 [ТС] | |
|
Psilon, Этот этап у меня не вызывает вопросов. Вопрос в алгоритме выбора i и j (в вашем коде).
Я собрался делать так: Первый цикл перебирает все точки, если точка непрозрачна, выбираем ее как начальную и ищем все возможные прямоугольные области, содержащие выбранную точку. Поиск всех возможных областей с заданной пока понятен. Вопрос в другом. У меня просто есть функция от (x,y) которая показывает, граничит ли пиксель(x,y) с рамками изображения или с прозрачными пикслеями. Если мы будем строить область (расширять) из пикселя лежащего в толще - мы в любом случае получим область заведомо не-уникальную (во всяком случае до или после она еще несколько раз повторится, просто на мой взгляд если начинать с граничных пикселей, таких повторов будет минимум), однако я не вполне уверен, точно ли такой подход покроет все возможные области.
0
|
|
|
189 / 189 / 38
Регистрация: 11.04.2009
Сообщений: 497
|
||||||||||||||||||||||
| 17.06.2013, 17:19 | ||||||||||||||||||||||
|
Тогда в случае матрицы 3x3:
0
|
||||||||||||||||||||||
|
Master of Orion
|
|
| 17.06.2013, 17:20 | |
|
GDev, мы идем из точки, пока не дойдем до границы. Каждая точка обрабатывается единожды. После получения области она заносится в отдельный массив областей. Пройдя по всей картинке мы определим все области. Не понимаю, в чем сложности, кроме разве что возможной линейной глубины рекурсии.
Добавлено через 34 секунды SandWraith, он берет все 8 соседних для текущей точки, посмотрите еще раз на цикл...
0
|
|
|
189 / 189 / 38
Регистрация: 11.04.2009
Сообщений: 497
|
|||
| 17.06.2013, 17:21 | |||
|
Добавлено через 48 секунд
1
|
|||
|
Master of Orion
|
|
| 17.06.2013, 17:23 | |
|
SandWraith, не вижу "более 1 пути", пусть у нас есть граф, отображающий связи на картинке. Тогда я тупо нахожу его конденсацию. А конденсация графа образуется единственно возможным образом.
0
|
|
|
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 19
|
||||||
| 17.06.2013, 17:30 [ТС] | ||||||
|
Хех. на разным языках говорим
SandWraith, перебор я в любом случае делаю, просто я не беру пиксели из толщи. Т.е. в изображени (как вы предложили, только я точкам имена дал для наглядности)
0
|
||||||
|
Master of Orion
|
||||||
| 17.06.2013, 17:31 | ||||||
|
GDev, если у вас они всегда такие, а без какой-нибудь хитрой геометрии типа:
0
|
||||||
|
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 19
|
|
| 17.06.2013, 17:32 [ТС] | |
|
0
|
|
|
189 / 189 / 38
Регистрация: 11.04.2009
Сообщений: 497
|
|||||||||||||||||
| 17.06.2013, 18:19 | |||||||||||||||||
0
|
|||||||||||||||||
|
Master of Orion
|
||
| 17.06.2013, 20:46 | ||
|
SandWraith, будет
0
|
||
| 17.06.2013, 20:46 | |
|
Помогаю со студенческими работами здесь
20
Требуется вычеркнуть минимально возможное количество чисел так, чтобы оставшиеся числа шли в порядке возрастания Добавить в начало и в конец строки минимально возможное одинаковое количество букв A, чтобы ее длина стала как минимум в 2 раза больше Минимально возможное расстройство Найти минимально возможное значение Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|