Обробка зображень: як виявити чотирибічну вивіску на зображенні?


14

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

Я використовую opencv.wrapper, але я новачок у ньому.

Спасибі.

Ось зразок: текст alt http://www.freeimagehosting.net/uploads/b03442fd36.png

alt text http://www.freeimagehosting.net/uploads/e6b36040e8.png

Через шум та багато ліній там я не в змозі визначити, яка є граничною лінією вивіски. Іноді я можу знайти межу ліній після перетворення Хогга. Я в пастці .... в такому сценарії ...

Це 2 сирі фотографії, зроблені з камери мобільного телефону

alt текст http://www.freeimagehosting.net/uploads/6dbd613edf.jpg alt текст http://www.freeimagehosting.net/uploads/720da20080.jpg

Мені потрібна порада для того, щоб побачити, як я можу обробити зображення, щоб отримати вивіску?

Велике спасибі


2
Ключові слова: OpenCV, жижки перетворення Дублікати: stackoverflow.com/questions/1817442 stackoverflow.com/questions/2068013

Так, хоуг трансформація FTW!

але на зображенні є шум, як я можу дізнатися, яка межа вивіски

@ xabi123: перетворення Хоуга, поріг, зачитаний кордон

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

Відповіді:


7

Обидва ваші зображення містять багато рядків, які не мають нічого спільного з знаком, який ви шукаєте. І деякі з цих ліній довші / мають вищий контраст, ніж лінії, які ви насправді хочете, тому, я думаю, виявити лінії ребер (наприклад, за допомогою перетворення Hough або шляхом підсумовування контрастів по горизонталі / вертикалі) не вийде.

Але: Знак, який ви шукаєте, має інші характеристики, які слід легше виявити:

  • Там фон знаків має (майже) постійну яскравість
  • Він займає відносно велику площу зображення
  • Це біля центру зображення

Отже, ви шукаєте велику пов’язану зону з низьким контрастом. Я зламав алгоритм підтвердження концепції в 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

Це може бути трохи перевернутою ідеєю, але, можливо, варто спробувати. Замість того, щоб намагатися виявити ректаж і мислити текст як шум , можливо, ви можете ставитися до тексту як до інформації та використовувати його для легшого виявлення ректажу.

Ось контур ідеї:

  • виявити текст на зображенні . Це не має бути надійною реалізацією (ви повинні мати можливість гуглювати деяку невелику бібліотеку, яка це робить, або, можливо, OpenCV це має), лише приблизна оцінка тексту на зображенні
  • знайдіть сітку всіх виявлень тексту . Навіть із галасливими зображеннями він повинен бути навколо справжнього місця
  • зробіть обман прямокутника Хаф на області навколо виявлення тексту . Можливо, використовуйте серединну відстань від центру виявлення тексту або щось подібне. Робіть різний діаметр і прийміть найсильніший відкликання .

Пояснення та переваги:

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