Каковы хорошие алгоритмы для обнаружения номерных знаков транспортных средств?
фон
для моего окончательного проекта в университете, я разрабатываю приложение для обнаружения номерных знаков транспортных средств. Я считаю себя промежуточным программистом, однако мои математические знания не имеют ничего выше средней школы, что делает создание правильных формул сложнее, чем это, вероятно, должно быть.
Я потратил много времени на поиск академических работ, таких как:
обнаружения номерных знаков транспортных средств в Изображения
надежное распознавание номерных знаков, используя изображения содержательность
местное повышение изображения автомобиля для обнаружения номерного знака
когда дело доходит до математики, я потерял. Благодаря этому тестированию различные графические изображения оказались продуктивными, например:

до

однако этот подход работал только для этого конкретного изображения, и если бы эти методы были применены к различным изображениям, я уверен, что произойдет более плохое преобразование. Я читал о формуле под названием "преобразование морфологии нижней шляпы", которая делает следующее:
в основном, преобразование сохраняет все темные детали изображения и устраняет все остальное (включая более крупные темные области и светлые области).
Я не могу найти много информации об этом, однако изображение в документации рядом с конец отчета показывает его эффективность.
другие ограничения
- разработка на C#
- ограничивая проект только регистрационными знаками Великобритании
- Я могу выбрать изображения для преобразования в качестве демонстрации
вопрос
мне нужен совет о том, какие методы преобразования я должен сосредоточиться на разработке, и какие алгоритмы могут мне помочь.
изменить: новая информация присутствует на Продолжение-Обнаружение Номерного Знака Транспортного Средства
11 ответов:
есть несколько подходов, которые вы можете принять, но первая стратегия, которая приходит в голову, это:
- Открытие/исследования: определить набор цветов и шрифтов, которые вам могут понадобиться для идентификации. Если ваш образец изображения является представителем большинства британских пластин, то ваша работа становится проще. Например, простой, единственный шрифт и черная надпись на белом фоне
- код: попытка определить прямоугольную область изображения, где цвет преимущественно белый и черный. Это не очень сложная математическая проблема, и она должна дать вам регион номерного знака, чтобы сосредоточиться.
- код: сделайте некоторые очистки на вашем субрегионе такое преобразование в чистый черно-белый (монохромный) и, возможно, масштабирование/сдвиг в хороший, плотный прямоугольник.
- Use API: затем используйте существующий алгоритм OCR (оптического распознавания символов) в вашей суб-выбранной области изображения, чтобы посмотреть, можете ли вы прочитать текст.
Как я уже сказал, это одна стратегия из многих, но она приходит на ум как одна, требующая наименьшего количества тяжелой математики... то есть, если вы можете найти реализацию OCR, которая будет работать для вас.
вы можете взглянуть на один из примеров emgucv, которые показывают вам реальные рабочие примеры обнаружения автомобильных пластин с помощью OCR
http://www.emgu.com/wiki/index.php/License_Plate_Recognition_in_CSharp
Я сделал подобный проект несколько лет назад в Java, сначала я применил оператор Собеля а затем замаскировал все изображение с изображением пластины (с оператором Sobel применяется тоже). Область максимального совпадения находится там, где находится пластина. Затем примените OCR к выбранной области, чтобы получить номер.
вот как я предлагаю вам выполнить эту задачу. Прочитайте мой подробный ответ здесь.
- преобразовать в оттенки серого.
- размытие Гаусса с фильтром 3x3 или 5x5.
применить фильтр Собеля, чтобы найти вертикальные края.
Sobel(gray, dst, -1, 1, 0)- порог результирующее изображение, чтобы получить двоичное изображение.
- примените морфологическую операцию закрытия, используя подходящий структурирующий элемент.
- найти контуры полученного изображения.
- найти
minAreaRectкаждого контура. Выберите прямоугольники на основе соотношения сторон и минимальной и максимальной площади.- для каждого выбранного контура найдите плотность кромки. Установите порог для плотности кромок и выберите прямоугольники, нарушающие этот порог, как возможные области пластины.
- после этого останется несколько прямоугольников. Вы можете фильтровать их на основе ориентации или любых критериев, которые вы считаете подходящими.
- закрепите эти обнаруженные прямоугольные части из изображения после
adaptiveThresholdисходного (в оттенках серого) изображения и применить OCR.
Это явно тип проблемы компьютерного зрения. Взгляните на OpenCV. Это в C++, но, вероятно, вы сможете интерфейс с ним как-то.
в Великобритании уже есть система, которая делает это. Я помню, как видел телешоу, в котором они продемонстрировали, что могут найти машину в Лондоне в течение 10 минут (предполагая, что они знают номер, и автомобиль едет вокруг) Просто чтение Википедии дает вам указатели, которые вам нужно, чтобы начать думать о проблеме: http://en.wikipedia.org/wiki/Automatic_number_plate_recognition
Он точно говорит вам, как вычислить преобразование нижней шляпы(похоже на инвертированное градуированное пороговое преобразование для меня).
Первое, что нужно сделать, это реализовать две функции морфологии дилатации и эрозии.
для этого вам нужны ваши f и b, затем вы вычисляете функцию над небольшой областью изображения в точке, сохраняя наибольшее найденное значение.
(f ⊕ b)(s, t) = max{f (s − x, t − y) + b(x, y) |(s − x), (t − y) ∈ Df ; (x, y)∈Db}что это говорит, возьмите максимум выражения по всем точкам в область домена (например,небольшой прямоугольник с центром в вашей точке (s, t).
простой псевдо код будет
max = -infinity // for the point (s,t) on the image, must compute this for all points for(x = -5 to 5) for(y = -5 to 5) max = Max(max, f(s - x, t - y) + b(x,y))фактически у нас теперь есть новый образ максимальных значений.
это на самом деле довольно просто,поэтому не усложняйте его(мы просто добавляем b(x, y) к каждой точке в регионе и выясняем, какой из них дает максимальное значение).
вы делаете то же самое для эрозии(очень похоже на выше)
теперь открытие и закрытие-это композиция из двух
вы можете думать об этом сначала как о выполнении дилатации, а затем эрозии для открытия.
Он говорит, Наконец, вычесть закрытие из исходного изображения, и вы должны иметь свое преобразование.
Если вас интересует проблема обнаружения наличия номерного знака (в отличие от его распознавания), вам, вероятно, следует посмотреть на обнаружение текста в изображениях, поскольку оно связано с тем, что вы делаете.
этот вопрос связан с вашим: алгоритм обнаружения наличия текста на изображении
вы можете использовать обнаружение прямоугольника в OpenCV или поезд haar как функции для обнаружения пластин, которые также присутствуют в opencv
вы также можете обратиться к автоматическая библиотека распознавания номерных знаков & запрос. Это также даст вам некоторое представление о том,как подходить к вещам, и как существующие решения.
но, как ответил пол, вы должны сначала попытаться найти прямоугольную номерную пластину из полного изображения, а затем бинаризовать ее, а затем использовать доступные библиотеки OCR (рекомендуется Tesseract)
вы можете обратиться к этой ссылке что поможет вам найти прямоугольную пластину. Вам нужно использовать библиотеки openCV, поэтому вам не понадобится много математики, но да базовое понимание того, что происходит за кулисами, может помочь вам решить проблему лучше.
вы можете проверить www.openalpr.com в качестве отправной точки. Он использует ряд методов для поиска и анализа номерного знака.
Comments