Вопрос

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

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

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

Это было полезно?

Решение

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

Я запустил демонстрацию жестких линий, поставляемую с opencv, и вот результат на изображении, которое вы дали (обнаруженные строки отмечены красным): alt text
(источник: 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 строки прямоугольник

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

<Ол>
  • Преобразовать в двоичный файл (т. е. все строки белые, остальное черное)
  • Выполните двоичное расширение (здесь вы делаете каждый пиксель, который касается белый пиксель в исходном изображении или белый пиксель в исходном изображении белого цвета. Касание только прямое (поэтому каждый пиксель «касается» пикселей слева, справа, над и под ним), это называется «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    
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top