Как распознать прямоугольники в этом изображении?
У меня есть изображение с горизонтальными и вертикальными линиями. На самом деле это изображение сайта BBC, преобразованного в горизонтальные и вертикальные линии. Моя проблема в том, что я хочу найти все прямоугольники на изображении. Я хочу написать компьютерную программу, чтобы найти все прямоугольники. Кто-нибудь знает, как это сделать или предложить идеи о том, как начать? Мне как человеку легко найти визуальные прямоугольники, но я не уверен, как описать это как программу.
Изображение сайта BBC здесь http://www.bbc.co.uk/
В дополнение к этому, я написал код, который преобразует изображение сайта BBC в горизонтальную и вертикальную линии, проблема в том, что эти линии не полностью встречаются в углах, а иногда они не полностью образуют прямоугольник. Спасибо!
Ответы
Ответ 1
Opencv (библиотека обработки изображений и компьютерного зрения, написанная на языке c) имеет реализацию для грубого преобразования (простое грубое преобразование находит строки на изображении, в то время как обобщенное находит более сложные объекты), так что это может быть хорошим началом. Для прямоугольников, которые имеют замкнутые углы, есть также детекторы углов, такие как cornerHarris, которые могут помочь.
Я запустил демонстрацию жестких линий с opencv, и вот результат на изображении, которое вы дали (обнаруженные линии отмечены красным):
(источник: splintec.com)
Ответ 2
Я считаю, что вы ищете обобщенное преобразование Хафа .
Ответ 3
В компьютерном видении есть алгоритм под названием Обобщенный Hough Transform, который может решить вашу проблему. Должен быть открытый исходный код, реализующий этот алгоритм. Просто найдите его.
Ответ 4
Предполагая, что это достаточно шумовое изображение (а не видео на экране), тогда должен работать один из простых алгоритмов заливки. Возможно, вам придется запустить расширение/эрозию изображения, чтобы закрыть пробелы.
Обычный способ поиска строк - это преобразование Хафа (тогда найти прямые под прямым углом)
Opencv - самый простой способ.
Взгляните на этот вопрос Обнаружение объектов OpenCV - Центрная точка
Ответ 5
Существует несколько различных подходов к вашей проблеме. Я бы использовал инструмент для обработки морфологических изображений, например этот. У вас будет гибкость, чтобы определить "прямоугольник" даже то, что не "точно закрыто" (где алгоритм заполнения не будет выполнен).
Другой возможностью может быть использование машинного обучения, который в основном более управляется данными, чем определение, как предыдущее. Вам нужно будет дать вашему алгоритму несколько "примеров" того, что представляет собой прямоугольник, и в конечном итоге он узнает (с bias и частота ошибок).
Ответ 6
итерации слева направо, пока вы не нажмете цветной пиксель, а затем используйте модифицированный алгоритм заполнения заливки. Дополнительная информация о algo flood fill @wiki
Ответ 7
другой подход состоял бы в том, чтобы найти ЛЮБОЙ цветной пиксель на изображении, а затем пойти с
while(pixel under current is colored)
{
lowest pixel coordinate = pixel under current
current = pixel under
}
то сделайте то же самое вверх.
теперь вы определили одну строку. затем используйте концы линий для приближения строк соответствия к прямоугольникам. если они не идеальны для пикселя, вы могли бы сделать какое-то трюки.
Ответ 8
Заполнение заливки будет работать, или вы можете использовать модификацию алгоритма отслеживания границ.
что вы делаете:
создайте 2d-массив (или любую другую структуру данных d2) - каждая строка представляет горизонтальную линию пикселей на экране, а каждый столбец - вертикальную линию
итерация по всем пикселям слева направо, и всякий раз, когда вы находите цветной, добавляйте его координаты к массиву
итерация по массиву и поиск строк и сохранение начального и конечного пикселей для каждого из них (различная структура данных)
зная, что начало каждой строки - это ее левый/верхний пиксель, вы можете легко проверить, не содержат ли 4 строки прямоугольник
Ответ 9
Чтобы получить изображение с почти касающимися горизонтальными и вертикальными линиями только к прямоугольникам:
- Преобразование в двоичное (т.е. все строки
белые, остальные черные)
- Выполните Двоичная дилатация (здесь вы делаете каждый пиксель, который касается белого пикселя в исходном изображении или является белым пикселем в источнике (только каждый пиксель "касается" пикселей слева, справа, над и под ним), это называется "4-связанный"
- повторите шаг 3 несколько раз, если промежутки между концами больше, чем 2 пикселя в ширину, но не слишком часто!
- Выполните операцию скелета (здесь вы делаете каждый пиксель на выходном изображении черным, если это белый пиксель в исходном изображении, который касается хотя бы одного черного пикселя, а белые пиксели, к которым он прикасается (в исходном изображении), все касаются друг друга Снова касание, определенное с 4-связностью. См. Пример ниже.
- Повторите шаг 4, пока изображение не изменится после повтора (все белые пиксели являются концами линии или разъемами)
Это, с некоторой удачей, сначала покажет коробки с толстыми жирными линиями, оставив толстые артефакты по всему изображению (после шага 3), а затем, после шага 5, все толстые артефакты жира будут удалены, тогда как все ящики остаются. Для достижения наилучших результатов вам нужно подправить количество повторов на шаге 3. Если вы заинтересованы в морфологии изображений, это книга действительно хорошего вступительного курса, который я взял.
Образец: (0 = черный, 1 = белый, пиксели в центре каждого блока 3x3 рассматриваются, ввод слева, выход справа)
011 => 011
011 => 001 all other white pixels touch, so eliminate
011 => 011
010 => 010
010 => 010 top pixel would become disconnected, so leave
010 => 010
010 => 010
010 => 000 touches only one white pixel, so remove
000 => 000
010 => 010
111 => 111 does not touch black pixels, leave
010 => 010
010 => 010
011 => 011 other pixels do not touch. so leave
000 => 000