Распознавание номеров на изображениях с Python и OpenCV

Этот урок описывает распознавание номерных знаков на изображениях и извлечение информации с использованием OpenCV и дополнительных библиотек Python. В отличие от предыдущего урока, здесь не применяется предобученная модель; вместо этого, используются сторонние библиотеки для считывания текста, а поиск номерных знаков осуществляется с помощью OpenCV.

Необходимые библиотеки

Перед началом работы установите следующие библиотеки:

  1. EasyOCR: для распознавания текста (pip install easyocr).
  2. OpenCV (cv2): для обработки изображений (предполагается, что уже установлена).
  3. imutils: дополнительные функции для работы с изображениями (pip install imutils).
  4. matplotlib: для отображения изображений (pip install matplotlib).

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

  1. Загрузка: img = cv2.imread(‘path/to/image.jpg’)
  2. Преобразование в серый формат: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  3. Отображение (matplotlib): img_rgb = cv2.cvtColor(gray, cv2.COLOR_GRAY2RGB); plt.imshow(img_rgb); plt.show()
  4. Уменьшение шума: Билатеральный фильтр:
    blurred = cv2.bilateralFilter(gray, 11, 15, 15)

    Параметры (11, 15, 15) могут изменяться.

  5. Поиск контуров:
    edged = cv2.Canny(blurred, 30, 200)
    contours, _ = cv2.findContours(edged, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

Отбор контуров, похожих на номерной знак

  1. Сортировка: Контуры сортируются по площади (8 самых больших):
    contours = sorted(contours, key=cv2.contourArea, reverse=True)[:8]
  2. Аппроксимация: cv2.approxPolyDP() используется для поиска контуров, близких к прямоугольнику (4 вершины):
    for c in contours:
        approx = cv2.approxPolyDP(c, 0.01 * cv2.arcLength(c, True), True)
        if len(approx) == 4:
            position = approx
            break

Выделение номерного знака

  1. Маска:
    mask = np.zeros(gray.shape, np.uint8)
    new_image = cv2.drawContours(mask, [position], 0, 255, -1)
    bitwiseAnd = cv2.bitwise_and(gray, gray, mask=mask)
  2. Вырезание:
    (x, y) = np.where(mask == 255)
    (x1, y1) = (np.min(x), np.min(y))
    (x2, y2) = (np.max(x), np.max(y))
    cropped = gray[x1:x2+1, y1:y2+1]

Распознавание текста

Библиотека EasyOCR используется для распознавания текста:

reader = easyocr.Reader(['en']) # 'en' - английский язык
text = reader.readtext(cropped)

Вывод результата

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

text = text[0][1]
cv2.putText(img, text, (x1, y2 + 60), cv2.FONT_HERSHEY_PLAIN, 3, (0, 0, 255), 2)
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)); plt.show()

Данный метод может давать неточные результаты. Для повышения точности рекомендуется использовать предобученные или собственные нейронные сети. Тем не менее, он демонстрирует базовые принципы обработки изображений и распознавания текста с помощью Python и OpenCV.

Что будем искать? Например,программа