Вступление

В Части 1 мы уже знали, как извлечь номерной знак из изображения с помощью Wpod-Net. Тем не менее, изображение номерного знака на этом этапе не имеет большого значения для нашей цифровой системы, за исключением распределенной амплитуды цвета. Таким образом, нам нужен способ, которым наша система может читать и понимать это. В этой статье я покажу вам шаг за шагом, как мы можем сегментировать ключевые символы из License Plate с помощью Python и OpenCV. Каждый из этих сегментированных символов позже будет пропущен через модель сверточной нейронной сети (CNN) (Часть 3 покажет вам, как обучать модель) и возвращен в виде цифрового письма. На рисунке 1 показан результат этой статьи.

Инструменты и библиотеки:

  • Python 3.7
  • Блокнот Jupyter
  • Numpy 1.17.4
  • Матплотлиб 3.2.1
  • OpenCV 4.1.0

Репозиторий Github

Записная книжка части 2

Обработка изображений

Для начала нам нужно применить несколько методов обработки, чтобы уменьшить шум и подчеркнуть ключевые особенности лицензионных символов. Мы будем использовать изображение номерного знака, извлеченное из Plates_example / germany_car_plate.jpg (рис. 2). Если вы не знаете, как извлекать номерной знак из изображения автомобиля, вы можете обратиться к Части 1 этой статьи здесь.

Обработка изображения, которую мы реализуем на нашем изображении, следующая:

  • Преобразовать в масштаб 255. Изображение лицензии, извлеченное из Wpod-Net, интерпретируется в масштабе 0–1, поэтому нам нужно преобразовать его в 8-битный масштаб как стандартное изображение.
  • Преобразовать в оттенки серого. Цвет играет незначительную роль в понимании номерного знака, поэтому мы можем удалить его, чтобы оптимизировать вычислительную мощность.
  • Размытие изображения. Технология размытия используется для удаления шума и нерелевантной информации. В примере кода я использовал Gaussian Blur с размером ядра (7,7), но это значение можно настроить в зависимости от вашего изображения. Чем больше размер ядра, тем меньше шума, но теряется больше информации.
  • Пороговое значение изображения. Мы устанавливаем порог, чтобы любое меньшее значение пикселя, чем оно, было преобразовано в 255 и наоборот. Этот тип установления порога называется обратным пороговым значением двоичного кода. В примере кода я использовал пороговое значение 180, это значение можно изменить, чтобы оно было более совместимо с вашим изображением.
  • Расширение. Это метод увеличения белой области изображения. Реализуя расширение, мы хотим улучшить белый контур каждого символа,

Код для этой части показан ниже:

Определить контур лицензионных персонажей

Затем мы будем использовать функцию findContours OpenCV для определения координат лицензионного символа. Эта функция основана на простой теории: контуры - это просто кривая, соединяющая все непрерывные точки (вдоль границы), имеющие одинаковый цвет и интенсивность. Я создал функцию под названием sort_contours, которая в основном сортирует сформированные контуры слева направо. Это важно, поскольку мы хотим не только распознать персонажей, но и расположить их в правильном порядке. Как видно из приведенного ниже примера кода, ratio в строке 16 равно высоте, деленной на ширину контура. Поскольку мы знаем, что наш лицензионный символ обычно имеет большую высоту, чем ширину, мы можем отфильтровать нерелевантные контуры, выбрав только контуры с соотношением от 1 до 3,5 (строка 18). Мы также знаем, что каждый лицензионный символ должен иметь высоту больше половины высоты пластины, поэтому мы можем добавить еще один контурный фильтр в виде строки 18. Позже мы рисуем границу со всеми контурами, которые проходят эти фильтры ( строка 20), применяет двоичное пороговое значение к каждому определенному контуру (строка 25) и добавляет их в список crop_characters.

Detect 7 letters...

Визуализируйте наших сегментированных персонажей

Теперь у нас уже есть все сегментированные символы, хранящиеся в crop_characters. Мы можем визуализировать это с помощью matplotlib, используя пример кода, как показано ниже. В части 3 мы обучим модель нейронной сети, которая способна распознавать и преобразовывать эти символы в цифровые буквы.

Ссылка на всю серию:

Часть 1: Обнаружение номерного знака с Wpod-Net

Часть 2: Сегментация символов пластин с помощью OpenCV

Часть 3: Распознавание автомобильных номерных знаков с помощью OpenCV и глубокого обучения