|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
07.01.2025, 18:03 | #1 |
Форумчанин
Регистрация: 04.01.2011
Сообщений: 267
|
Алгоритм поиска прямоугольников в bmp
Добрый день. Есть задача поиска прямоугольников в BMP файле со следующими параметрами:
1) исходный файл черно-белый (белый цвет значащий), разрядность 1-бит 2) размер файла 1920х1031 пиксель, но это не принципиально, размеры могут быть всякие 3) фигуры внутри файла могут быть всякие, но это не принципиально, нужны только прямоугольники, даже если сложная фигура будет определена как прямоугольник значения не имеет текущий код позволяет найти координаты прямоугольников те что справа после первого найденного прямоугольники Код:
file.bmp входной файл data.bmp результат поиска вопрос: может кто что подскажет по алгоритму? Заранее спасибо за ответы по ЗАДАННЫМ вопросам |
07.01.2025, 18:58 | #2 |
Форумчанин
Регистрация: 16.05.2024
Сообщений: 106
|
Изображение разбивается на два изображения посередине горизонтальной линией. Делается поиск в верхнем и в нижнем изображении. Потом каждое изображение ещё разбивается напополам и т.д. Вобщем рекурсивный поиск.
|
08.01.2025, 18:12 | #3 |
Форумчанин
Регистрация: 16.05.2024
Сообщений: 106
|
Предлагаю такой алгоритм:
изображение покрывается сеткой из точек, расстояние по вертикали и горизонтали между точками - половина от минимального размера прямоуголника. Далее проходим по каждой точке, если она попала в прямоуголник (то есть соответствующий цвет), то идём от этой точки влево, вправо, вверх, вниз то тех пор, пока не изменится цвет (то есть пока не закончится прямоуголник). Таким образом мы можем определить координаты прямоуголника. Эти координаты добавляем в список, а последующие точки проверяем на вхождение в прямоугольник в списке. Если точка входит в уже найденный прямоугольник, то переходим к следующей точке. В реальной программе надо предварительно изображение обработать для исключения шума. Вот программа на Java, демонстрирущая основной алгоритм: Код:
Вот такой вывод у программы: Код:
|
08.01.2025, 18:28 | #4 |
Участник клуба
Регистрация: 03.06.2009
Сообщений: 1,861
|
а прямоугольник обязательно должен быть строго вертикальным или горизонтальным?
а если это всё же будет ромб или параллелограмм, т.е. проверку углов на соответствие 90 градусам надо делать?
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
|
08.01.2025, 20:23 | #5 |
Регистрация: 17.01.2020
Сообщений: 5
|
Бонжур а ту лё монд
А то вот есть ещё такой "алгоритм": 1. Находим потенциальные углы (лев. верхн., лев. нижн., прав. верхн., прав. нижн.) 1а. Заносим их в отдельные списки. 2. Находим соответствующие координаты, 2а. попутно выбрасывая слишком мелкие прямоугольники. 2б. Добавляем координаты годных прямоугольников в список. 3. Фильтруем список от лишних прямоугольников (накладывающихся, залитых чернотой). Получаем примерно такой результат: 19 rects 9 : 18 : 278 : 84 | 274 : 356 : 302 : 372 | 277 : 379 : 351 : 459 | 274 : 573 : 302 : 590 | 277 : 598 : 351 : 677 | 274 : 761 : 302 : 777 | 275 : 785 : 353 : 863 | 273 : 867 : 288 : 882 | 274 : 986 : 302 : 1002 | 274 : 1013 : 354 : 1030 | 446 : 574 : 580 : 591 | 445 : 987 : 579 : 1003 | 507 : 351 : 526 : 371 | 514 : 756 : 533 : 776 | 634 : 569 : 653 : 588 | 675 : 981 : 694 : 1000 | 1424 : 924 : 1551 : 951 | 1520 : 725 : 1551 : 752 | 1911 : 223 : 1917 : 1023 | Картинка с найденными залитыми прямоугольниками |
08.01.2025, 21:31 | #6 |
Форумчанин
Регистрация: 04.01.2011
Сообщений: 267
|
DeepFlake, спасибо за алгоритм, попробую перевести на делфи
NetSpace, проверку углов на соответствие 90 градусам НЕ надо делать, там есть реальные прямоугольники и всякие многоугольники. но это не важно. есть еще тессеракт для символов, оно поможет отсеять не нужное |
09.01.2025, 06:13 | #7 |
Форумчанин
Регистрация: 04.01.2011
Сообщений: 267
|
|
09.01.2025, 15:03 | #8 |
Форумчанин
Регистрация: 16.05.2024
Сообщений: 106
|
to Pcrepair:
в примерном изображении много одиночных белых точек (шума), я предлагаю фильтрациию так сделать: сначала перевести изображение в формат градаций серого, потом размыть изображение, то есть всё изображение разбить на квадраты 2х2 пиксела и усреднить в них цвет. Так исчезнут одиночные точки. Потом применить фильтр "резкость", потом перевести в монохромное изображение. |
10.01.2025, 00:02 | #9 |
Регистрация: 17.01.2020
Сообщений: 5
|
Ну, как... Перебираем все точки, смотрим не являются ли они углами, например у левого верхнего угла, кот. белый пиксель, слева и сверху будут черные пиксели (тут же можно фильтровать одиночные пиксели) и т. д., и заносим их все в TList. ... А, дошло. Вам нужно чисто практически, как перебрать все пиксели. Код во вложении, тогда.
|
11.01.2025, 18:05 | #10 |
Форумчанин
Регистрация: 16.05.2024
Сообщений: 106
|
Вот программа по моему алгоритму, то есть изображение покрывается сеткой из точек, в каждой точке проверяется цвет, если цвет нужный то проверяется не попала ли точка в уже найденный прямоугольник. Если не попала, то находим границы прямоуголника путём сканирования точек от исходной в разные стороны пока не дойдём до точки с другим цветом или границы изображения.
С этим алгоритмом возникли такие сложности: во-первых, у некторых прямоугольников углы закруглённые, и если точка сетки попала на край прямоугольника, то обнаруживается граница прямоугольника только до начала закругления угла, а не до самой границы. Эта проблема решается путём объединения нескольких найденных областей в одну. То есть из нескольких точек сетки будут найдены области прямоугольника, и потом они объединяются. Вторая проблема - прямоугольники в виде рамки, то есть у них внутри цвет чёрный. Эта проблема решается путём проверки цвета в середине найденного прямоугольника. Программа на Java, у меня нет Delphi. |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Алгоритм поиска c/c++ | ytrewqwsd1 | Помощь студентам | 0 | 22.05.2022 17:41 |
Алгоритм поиска | Sylar9 | Общие вопросы C/C++ | 0 | 03.04.2012 12:38 |
Нужно найти алгоритм для пересечения отрезка с набором прямоугольников | Trinock | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 4 | 01.12.2011 14:31 |
Алгоритм перемешивания данных о координатах 9 прямоугольников, которые находятся в структуре | Mehanizator | Помощь студентам | 15 | 17.08.2011 19:32 |