Подтвердить что ты не робот

Как распознать прямоугольники в этом изображении?

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

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


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

4b9b3361

Ответ 1

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

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