25

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

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

Спасибо, Филипп


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

+3

аккуратным. какая программа используется для создания изображения? Не могли бы вы использовать его исходный код - который определяет поля для их рисования - для ваших целей? Или у вас есть только окончательный .png образ для работы? – poundifdef

+0

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

+0

Можете ли вы поделиться своими результатами по этому вопросу и как вы пришли к вышеуказанной графике? – Xolve

ответ

18

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

Я побежал houghlines демо предоставляется OpenCV и вот результат на изображение, которое вы дали (обнаруженные линии, отмеченные красным цветом): alt text http://imageapp.splintec.com/images/Screenshot2.png

1

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

0

другой подход будет найти любой цветной пиксель на изображении, а затем пойти с

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

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

1

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

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

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

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

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

3

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

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

Взгляните на этот вопрос OpenCV Object Detection - Center Point

2

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

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

4

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

1

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

  1. Преобразования в двоичный (то есть всех линии белые, остальное черное)
  2. Выполнить a Binary dilation (здесь вы делаете каждый пиксель, который касается белого пикселя в исходном изображении или белый пиксель в исходном изображении белого цвета. Touch прямолинейный (так что каждый пиксель «касается» пикселей слева, справа, сверху и снизу это) это называется «4-связанным»
  3. повторите шаг 3 несколько раз, если промежутки между концами больше, чем 2 пикселя в ширину, но не слишком часто!
  4. Выполнение операции скелета (здесь вы делаете каждый пиксель на выходном изображении черным, если он представляет собой белый пиксель в исходном изображении, который касается хотя бы одного черного пикселя и белые пиксели, к которым он прикасается (в исходном изображении), все касаются друг друга . Снова коснитесь определяется с 4-связанности. См образец ниже.
  5. Повторите шаг 4 до тех пор пока изображения не изменяется после повторения (все белые пиксели линия заканчивается или разъемы)

это будет, с бит удачи, сначала покажите коробки с толстыми жирными линиями, оставив толстые артефакты по всему изображению (после шага 3), а затем, после шага 5, все толстые артефакты жира будут удалены, а все ящики остаются. k количество повторов на шаге 3 для достижения наилучших результатов. Если вы заинтересованы в морфологии изображения this is the book of a really good introductory course I took.

Пример: (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  
Смежные вопросы