Задание 1. Распознавание цифр номера.

Введение

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

Описание основной части задания

Выделение цифр на номере

Примерный алгоритм выделения цифр на номере следующий (в скобках приведены возможные варианты встроенных функций Matlab):

  1. Нормализация контраста и освещенности (imadjust)
  2. Подавления шума (imfiler и fspecial с параметром 'disk', 'average' или 'gaussian')
  3. Бинаризация изображения
  4. Поиск связанных компонент на бинаризованном изображении (regionprops с параметром 'BoundingBox')
  5. Выделение среди всех найденных связанных компонент букв и цифр номера (оптимизация некоторого функционала)

В вашем распоряжении есть априорная информация о буквах и цифрах в номере:

  1. Номер имеет следующую структуру - а111аа, где а - любая буква, 1 - любая цифра
  2. Ширина букв и цифр должна быть примерно одинакова
  3. Буквы имеют одинаковую высоту, цифры тоже
  4. Высота букв меньше высоты цифр
  5. Ограничивающие прямоугольники букв и цифр не могут быть слишком большими или слишком маленькими
  6. Расстояния между соседними ограничивающими прямоугольниками равны между собой
  7. Ограничивающие прямоугольники не должны пересекаться

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

Опционально можно попробовать осуществить ректификацию - повернуть номер так, чтобы он оказался расположенным строго горизонтально. Это можно осуществить, базируясь на алгоритмах определения параметров моделей (RANSAC, Hough Transform). Обратите внимание, что знаки часто являются изогнутыми и их горизонтальные границы не всегда образуют прямые линии. Поэтому, возможно, стоит попробовать вписывать полиномы второго или высших порядков.

Описание первого метода распознавания цифр

Что нужно сделать:

  1. Описание каждой выделенной цифры с помощью геометрических признаков, рассмотренных на третьей лекции (многие полезные признаки можно получить с помощью функции regionprops)
  2. Ручной подбор решающих правил, позволяющих лучше всего разделить цифры (для упрощения процедуры подбора рекомендуется воспользоваться графическим анализом признаков, функции scatter, bar, bar3)
  3. Распознавание каждой выделенной цифры по подобранным решающим правилам.

Описание второго метода распознавания цифр

Что нужно сделать:

  1. Построение шаблона для каждой цифры путём усреднения изображений
  2. Распознавание цифр с помощью сопоставления с шаблоном. Шаблон может быть создан на основе интенсивностей. Далее можно напрямую сопоставлять шаблон на интенсивностях с вырезанной цифрой, либо сделать distance transform и проводить сопоставление с помощью chamfer или hausdorff distance

Реализация

Концептуально работа функции выглядит следующим образом: на вход подаётся файл с изображением и набор параметров. На выходе - три распознанные цифры номера. При этом пользователь может выбрать один из двух алгоритмов распознавания (или третий бонусный алгоритм опционально). Также, пользователь может выбрать опцию отображения результатов, в этом случае должно быть отображено изображение номера с тремя выделенными на нём цифрами:
nomer
Конкретнее, алгоритм должен быть реализован в виде функции со следующей сигнатурой:
three_numbers = CarNumberRecognition(filename, show, recognition_method), где

  • filename - имя файла с изображением знака
  • show - флаг, указывающий нужно ли отображать результаты работы, т.е. показывать номер и три ограничивающих прямоугольника вокруг найденных цифр (true - отображать, false - не отображать)
  • recognition_method - метод распознавания (0 - на основе инвариантов, 1 - на основе шаблонов, 2 - ваш собственный вариант)
  • three_numbers - массив, содержащий три цифры номера

Параметры входных данных:

  • Изображения номеров являются полутоновыми и сделаны с небольшим запасом
  • Цифры и буквы на номерах размещены последовательно (в виде одной строки)
  • Отношение высоты к ширине видимых на изображении символов не обязательно совпадает с тем, которое задается ГОСТом; отличия могут достигать 25%

Бонусная часть задания

  1. В качестве бонуса предлагается решить задачу, состоящую из снимков, сделанных ночью. В этом случае одна и та же функция должна работать как на дневных, так и на ночных данных
  2. Решить задачу поиска цифр с использованием плавающего окна и сопоставления с шаблоном. Шаблон может быть составлен на основе интенсивностей. Либо можно применить более робастную технику на основ chamfer или Hausdorff distance
  3. Предложить свой метод распознавания знаков или поиска ограничивающих прямоугольников, который будет работать не хуже базовых

Оценка и рейтинг

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

Содержание архива с выполненным заданием

Архив должен содержать файл readme, со следующей информацией:

Общая информация:

  1. ФИО: <Фамилия Имя Отчество> Группа: <номер группы>
  2. Задание: <номер задания> / <название задания>
  3. Система: <система программирования> ОС: <операционная система>
  4. Комментарии: <комментарии по реализации / пожелания / впечатления и т.д.>

Базовая часть:

  • Краткое описание метода бинаризации
  • Описание использованных признаков
  • Какой метод сопоставления с шаблоном был выбран? (сопоставление по интенсивности, с помощью distance transform, другой). Если были реализованы два метода, то какой из них показал лучший результат?
  • Какой точности удалось достичь на выданных дневных данных?

Бонусная часть (описание только частей, которые были реализованы):

  • Какой точности удалось достичь на выданных ночных данных?
  • Насколько хорошо работает поиск цифр на основе скользящего окна и сопоставления с шаблоном (по сравнению с бинаризацией-выделением связанных компонент-минимизацией функционала)? Предпочтительнее количественное сравнение, то есть подсчет точности двух методов. Точность может выражаться количеством верно найденных ограничивающих прямоугольников
  • Если предложен свой метод, то вставить его подробное описание и возможное обоснование, почему он работает лучше

Материалы

© Лаборатория компьютерной графики при ВМиК МГУ