Как распознать прямоугольники на этом изображении?
-
08-07-2019 - |
Вопрос
У меня есть изображение с горизонтальными и вертикальными линиями. На самом деле это изображение сайта BBC, преобразованного в горизонтальные и вертикальные линии. Моя проблема в том, что я хочу найти все прямоугольники на изображении. Я хочу написать компьютерную программу, чтобы найти все прямоугольники. Кто-нибудь знает, как это сделать или предложить идеи о том, как начать? Мне как человеку легко найти визуальные прямоугольники, но я не уверен, как описать это как программу.
Изображение с сайта BBC здесь http://www.bbc.co.uk/ р> <Ч>
В дополнение к этому я написал код, который преобразует изображение веб-сайта BBC в горизонтальную и вертикальную линии, проблема в том, что эти линии не полностью встречаются в углах, а иногда они не полностью образуют прямоугольник. Спасибо!
Решение
Opencv (библиотека обработки изображений и компьютерного зрения, написанная на языке c) имеет реализацию для грубого преобразования ( простое грубое преобразование находит линии на изображении, в то время как обобщенное находит более сложные объекты, так что это может быть хорошим началом. Для прямоугольников, которые имеют замкнутые углы, есть также детекторы углов, такие как cornerHarris, которые могут помочь.
Я запустил демонстрацию жестких линий, поставляемую с opencv, и вот результат на изображении, которое вы дали (обнаруженные строки отмечены красным):
(источник: splintec.com )
Другие советы
Полагаю, вы ищете обобщенное преобразование Хафа .
В компьютерном зрении есть алгоритм под названием Generalized Hough Transform , который может решить вашу проблему , Должен быть открытый исходный код, реализовавший этот алгоритм. Просто найдите его.
Если предположить, что это изображение без шума (не видео с экрана), тогда должен работать один из простых алгоритмов заливки. Возможно, вам придется выполнить расширение / размытие изображения, чтобы закрыть пробелы.
Обычный способ найти линии - преобразование Хафа (затем найти линии под прямым углом) Opencv - самый простой способ.
Посмотрите на этот вопрос Обнаружение объектов OpenCV - Центральная точка
Есть несколько разных подходов к вашей проблеме. Я бы использовал инструмент для обработки морфологических изображений , например этот . У вас будет возможность определить " прямоугольник " даже то, что не «точно закрыто» (где алгоритм заполнения потерпит неудачу).
Другой возможностью может быть использование подхода к машинному обучению , который в основном состоит из управляемый, чем управляемый определением, как предыдущий. Вы должны будете привести свой алгоритм в несколько «примеров». о том, что такое прямоугольник, и он в конечном итоге узнает (с уклоном и частотой ошибок) . р>
итерируйте слева направо, пока не достигнете цветного пикселя, а затем используйте модифицированный алгоритм заливки. дополнительная информация о алгоритме заливка заливки @ wiki
другой подход заключается в том, чтобы найти ЛЮБОЙ цветной пиксель на изображении, а затем использовать
while(pixel under current is colored)
{
lowest pixel coordinate = pixel under current
current = pixel under
}
затем сделайте то же самое вверх. Теперь вы определили одну строку. затем используйте концы линий, чтобы приблизить линии к прямоугольникам. если они не идеальны по пикселям, вы можете сделать что-то вроде трешолдинга.
Заливка будет работать, или вы можете использовать модификацию алгоритма отслеживания ребер.
что вы делаете: создать двумерный массив (или любую другую структуру данных d2) - каждая строка представляет горизонтальную линию пикселей на экране, а каждый столбец - вертикальную линию
перебирайте все пиксели слева направо, и всякий раз, когда вы найдете цветной, добавьте его координаты в массив
перебирать массив, находить строки и сохранять начальный и конечный пиксели для каждого (различная структура данных)
зная, что начало каждой строки - это левый / верхний пиксель, вы можете легко проверить, составляют ли какие-либо 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