|
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 19
|
|
.NET 3.x Разбиение битмапа на минимально возможное количество областей17.06.2013, 15:45. Показов 1874. Ответов 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 раза больше Минимально возможное расстройство Найти минимально возможное значение Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|