Как распознать прямоугольники на этом изображении? - PullRequest
31 голосов
/ 30 ноября 2009

У меня есть изображение с горизонтальными и вертикальными линиями. На самом деле это изображение сайта BBC, преобразованного в горизонтальные и вертикальные линии. Моя проблема в том, что я хочу найти все прямоугольники на изображении. Я хочу написать компьютерную программу, чтобы найти все прямоугольники. Кто-нибудь знает, как это сделать или предложить идеи о том, как начать? Мне как человеку легко найти визуальные прямоугольники, но я не уверен, как описать это как программу.

Изображение с сайта BBC здесь http://www.bbc.co.uk/


Обновление к этому, я написал код, который преобразует изображение сайта BBC в горизонтальную и вертикальную линию, проблема в том, что эти линии не полностью встречаются в углах, а иногда они не полностью образуют прямоугольник. Спасибо!

Ответы [ 9 ]

22 голосов
/ 23 декабря 2009

Opencv (библиотека обработки изображений и компьютерного зрения, написанная на c) имеет реализацию для грубого преобразования (простое грубое преобразование находит строки в изображении, в то время как обобщенное находит более сложные объекты), так что это хорошее начало. Для прямоугольников, которые имеют замкнутые углы, существуют также детекторы углов, такие как cornerHarris, которые могут помочь.

Я запустил демонстрацию жестких линий, поставляемую с opencv, и вот результат на изображении, которое вы дали (обнаруженные линии отмечены красным): alt text
(источник: splintec.com )

8 голосов
/ 30 ноября 2009

Я полагаю, вы ищете обобщенное преобразование Хафа .

4 голосов
/ 30 ноября 2009

В компьютерном зрении есть алгоритм под названием Обобщенный Преобразование Хафа , который может решить вашу проблему. Должен быть открытый исходный код, реализовавший этот алгоритм. Просто найдите его.

3 голосов
/ 30 ноября 2009

Если предположить, что это изображение без шума (не видео с экрана), тогда должен работать один из простых алгоритмов заливки. Вам может понадобиться выполнить расширение / размытие изображения, чтобы закрыть пробелы.

Обычный способ найти линии - преобразование Хафа (затем найти линии под прямым углом) Opencv - самый простой способ.

Посмотрите на этот вопрос Обнаружение объектов OpenCV - Центральная точка

2 голосов
/ 30 ноября 2009

Есть несколько разных подходов к вашей проблеме. Я бы использовал инструмент для обработки морфологических изображений , такой как этот . У вас будет возможность определять «прямоугольник» даже для чего-то, что не является «точно закрытым» (где алгоритм заливки потерпит неудачу).

Другая возможность может заключаться в использовании подхода машинного обучения , который в основном более ориентирован на данные, чем на определения, как и предыдущий. Вы должны будете привести свой алгоритм к нескольким «примерам» того, что такое прямоугольник, и он в конечном итоге узнает (с смещением и частотой ошибок).

1 голос
/ 08 декабря 2009

Чтобы получить полученное изображение с почти соприкасающимися горизонтальными и вертикальными линиями и прямоугольниками:

  1. Преобразовать в двоичный файл (т.е. все строки белые, остальное черное)
  2. Выполните двоичное расширение (здесь вы делаете каждый пиксель, который касается белого пикселя в исходном изображении или является белым пикселем в исходном изображении, белым. Касание только прямое (поэтому каждый пиксель "касается") пикселей слева, справа, сверху и снизу) это называется «4-х подключен»
  3. повторите шаг 3 несколько раз, если промежутки между концами больше 2 пикселей в ширину, но не слишком часто!
  4. Выполните операцию скелета (здесь вы делаете каждый пиксель в выходном изображении черным, если это белый пиксель в исходном изображении, который касается хотя бы одного черного пикселя, а белые пиксели, которых он касается (в исходном изображении), касаются друг друга Снова коснитесь определенного с 4-связностью. См. Образец ниже.
  5. Повторите шаг 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    
1 голос
/ 30 ноября 2009

Будет работать заливка, или вы можете использовать модификацию алгоритма отслеживания ребер.

что вы делаете: создать двумерный массив (или любую другую структуру данных d2) - каждая строка представляет горизонтальную линию пикселей на экране, а каждый столбец - вертикальную линию

перебирает все пиксели слева направо, и всякий раз, когда вы найдете цветной, добавьте его координаты в массив

итерация по массиву, поиск строк и сохранение начального и конечного пикселей для каждого (различная структура данных)

зная, что начало каждой строки является ее левым / верхним пикселем, вы можете легко проверить, составляют ли какие-либо 4 строки прямоугольник

1 голос
/ 30 ноября 2009

другим подходом было бы найти ЛЮБОЙ цветной пиксель на изображении, а затем перейти к

while(pixel under current is colored)
{
  lowest pixel coordinate = pixel under current
  current = pixel under
}

затем сделайте то же самое вверх. Теперь вы определили одну строку. затем используйте концы линий, чтобы приблизить линии к прямоугольникам. если они не идеальны по пикселям, вы можете сделать какой-нибудь трешолдинг.

1 голос
/ 30 ноября 2009

итерация слева направо, пока вы не нажмете цветной пиксель, затем используйте модифицированный алгоритм заливки. больше информации о алгоритме заливка @ wiki

...