Обработка изображений: Как обнаружить четырехугольную вывеску на изображении?


14

Как я могу обнаружить четырехугольную вывеску по изображению, снятому с помощью мобильного телефона? Как я могу обнаружить формы, такие как прямоугольник? скругленный прямоугольник (закругленные углы вместо углов формы)?

Я использую opencv.wrapper, но я новичок в этом.

Благодарю.

Вот пример: альтернативный текст http://www.freeimagehosting.net/uploads/b03442fd36.png

альтернативный текст http://www.freeimagehosting.net/uploads/e6b36040e8.png

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

Это 2 сырые фотографии, сделанные с камеры мобильного телефона

альтернативный текст http://www.freeimagehosting.net/uploads/6dbd613edf.jpg альтернативный текст http://www.freeimagehosting.net/uploads/720da20080.jpg

Мне нужен совет, чтобы увидеть, как я могу обработать изображение, чтобы вывесить вывеску?

большое спасибо


2
Ключевые слова: opencv, грубое преобразование. Дубликаты: stackoverflow.com/questions/1817442 stackoverflow.com/questions/2068013

Дааааааааааааааааааааааааааааааааааааааааа!

но на изображении есть шум, как я могу узнать, какая граница вывески

@ xabi123: грубое преобразование, порог, считывание границы

1
Не могли бы вы поделиться примером изображения?

Ответы:


7

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

Но: у знака, который вы ищете, есть другие характеристики, которые должно быть легче обнаружить:

  • Там знак фона имеет (почти) постоянную яркость
  • Занимает относительно большую площадь изображения
  • Это недалеко от центра изображения

Итак, вы ищете большую соединенную область с низким контрастом. Я взломал алгоритм проверки концепции в Mathematica. (Я не эксперт по OpenCV, но я упомяну соответствующую функцию OpenCV, когда узнаю их.)

Во-первых, я использую фильтры гауссовых производных для определения величины градиента в каждом пикселе. Производный фильтр Гаусса имеет широкую апертуру (в данном случае 11x11 пикселей), поэтому он очень нечувствителен к шуму. Затем я нормализую градиентное изображение до значения = 1, поэтому я могу использовать одинаковые пороговые значения для обоих образцов.

src = Import["http://www.freeimagehosting.net/uploads/720da20080.jpg"];
pixels = ImageData[ColorConvert[src, "Grayscale"]];
gradient = Sqrt[GaussianFilter[pixels, 5, {1, 0}]^2 + GaussianFilter[pixels, 5, {0, 1}]^2];
gradient = gradient/Mean[Flatten[gradient]];

Реализация OpenCV: вы можете использовать sepFilter2Dдля фактической фильтрации, но, очевидно, вам придется самостоятельно вычислять значения ядра фильтра .

Результат выглядит так:

величина градиента

На этом изображении фон знака темный, а границы знака яркие. Таким образом, я могу преобразовать изображение в двоичную форму и искать темные компоненты

binaryBorders = Binarize[Image[gradient], 0.2];
sign = DeleteBorderComponents@ColorNegate[binaryBorders];
largestComponent = SortBy[ComponentMeasurements[sign, {"Area", "ConvexVertices"}][[All, 2]], First][[-1, 2]];

Реализация OpenCV: пороговое значение должно быть простым, но я думаю, что OpenCV не содержит анализа подключенных компонентов - вы можете использовать для этого заливку или cvBlobsLib .

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

Результаты: введите описание изображения здесь введите описание изображения здесь


0

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

Если, например, вывеска (или ее границы) светлее, чем ее окружение (что имеет место для всех примеров, показанных в вопросе), у вас будет два пика на кривой оси X (для левой и правой сторон и границ ) и два пика в вашей кривой оси Y (для верхней и нижней границ). Используя метод обнаружения границ для одномерного сигнала (возможно, фильтра верхних частот), вы можете определить координаты углов вывески.

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


хм .. а что если вывеска повернута или камера закатана?
Мустафа,

0

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

Вот схема идеи:

  • обнаружить текст на изображении . Это не обязательно должна быть надежная реализация (вы должны иметь возможность использовать небольшую библиотеку Google, которая делает это, или, возможно, она есть у OpenCV), просто приблизительная оценка текста на изображении.
  • найти центр всех обнаружений текста . Даже с шумными изображениями это должно быть вокруг реального места
  • Сделайте хотя бы обман прямоугольника на области вокруг текстовых обнаружений . Может быть, использовать среднее расстояние от центра обнаружения текста или что-то подобное. Делайте разные диаметры и берите сильнейший отзыв .

Объяснения и преимущества:

  • область вокруг текста обычно однородна - реальный прямоугольник должен быть первым сильным напоминанием
  • Таким образом, вам не нужно выполнять грубое преобразование всего изображения, поэтому вы можете сделать это более тщательно (возможно, несколько раз на одной и той же области, но с разными размерами сегментов ...)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.