Подтвердить что ты не робот

Как классифицировать размытые числа с помощью openCV

Я хотел бы записать число из этого изображения.

введите описание изображения здесь

Я попробовал многомасштабное сопоставление по следующей ссылке.

http://www.pyimagesearch.com/2015/01/26/multi-scale-template-matching-using-python-opencv/

Все, что я хочу знать, это красный номер. Но проблема в том, что красное число размыто для шаблона распознавания/соответствия openCV. Будет ли другой способ обнаружить это красное число на черном фоне?

4b9b3361

Ответ 1

Классификация цифр

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

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

Янн ЛеКун перечислил современное состояние в этом наборе данных mnist hand-written dataset.

В дальнем конце спектра сверточные нейронные сети дают возмутительно низкие коэффициенты ошибок (доля ошибок 1%). Для более простого решения k-ближайших соседей, использующих коррекцию, удаление шума, размытие и смещение в 2 пикселя, дало ошибку около 1% и значительно быстрее реализовано. Python opencv имеет реализацию. Нейронные сети и поддерживающие векторные машины со стандартом также имеют довольно впечатляющие показатели производительности.

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

Python поддерживает множество методов машинного обучения в потрясающем пакете sklearn - вот примеры использования склеарна для mnist. Если вы ищете учебное объяснение машинного обучения в python, собственный учебник sklearn очень подробен

Из ссылки sklearn: Классификация mnist

Это те предметы, которые вы пытаетесь классифицировать, если вы изучаете использование этого подхода. Чтобы подчеркнуть, насколько легко начать обучение некоторых из этих классификаторов, основанных на машинном обучении, вот сокращенный раздел из кода примера в связанном пакете sklearn:

digits = datasets.load_digits() # built-in to sklearn!
data = digits.images.reshape((len(digits.images), -1))

# Create a classifier: a support vector classifier
classifier = svm.SVC(gamma=0.001)

# We learn the digits on the first half of the digits
classifier.fit(data[:n_samples / 2], digits.target[:n_samples / 2])

Если вы привязаны к openCv (возможно, потому, что вы хотите в будущем подключиться к системе реального времени), opencv3/python имеет учебник по этой точной теме тоже! Их демо использует k-ближайший сосед (перечисленные на странице LeCun), но они также имеют svms и многие другие инструменты в sklearn, Их ocr-страница с использованием SVM использует функцию roundewing, которая может быть полезна с эффектом перспективы в вашей проблеме:

Цифровая цифра


ОБНОВЛЕНИЕ:. Я использовал описанный выше подход к skimage на вашем изображении, сильно обрезанный, и правильно классифицировал его. A lot потребуется больше тестирования, чтобы убедиться, что это рибуст на практике

введите описание изображения здесь

^^ Это крошечное изображение - это 8x8 урожая изображения, которое вы вложили в свой вопрос. mnist - 8x8 изображений. Вот почему он тренируется менее чем за секунду с аргументами по умолчанию в skimage.

Я преобразовал его в правильный формат, масштабируя его до диапазона mnist, используя

number = scipy.misc.imread("cropped_image.png")
datum  =  (number[:,:,0]*15).astype(int).reshape((64,))
classifier.predict(datum) # returns 8

Я ничего не изменил из примера; здесь я использую только первый канал для классификации и не вычисляю умных функций. 15 посмотрел прямо на меня; вам нужно настроить его, чтобы попасть в целевой диапазон или (в идеале) предоставить свой собственный набор для обучения и тестирования


Обнаружение объектов

Если вы не выделили номер на изображении, вам понадобится детектор объекта. Литературное пространство по этой проблеме является гигантским, и я не начну с того, что кроличья дыра (google Viola и Jones, может быть?) Этот блог охватывает основы детектора "скользящего окна" в питоне. Адриан Розброк выглядит так, как будто он даже является спонсором SO, и на этой странице есть несколько хороших примеров детекторов объектов на основе opencv и python, которые были довольно укомплектованы (вы действительно связаны с этим блогом в своем вопросе, я не понимал).

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

Ответ 2

У вас есть несколько вещей, которые вы можете использовать в своих интересах:

  • Число находится внутри черной прямоугольной рамки и одного цвета
  • Число отображается как сегментированный ЖК-дисплей, если есть только конечное число сегментов, которые выключены или включены.

Поэтому я предлагаю вам:

  • Откалибруйте камеру и предварительно обработайте изображение, чтобы удалить искажение объектива.
  • Исправить прямоугольник дисплея:
    • Обнаружить прямоугольник дисплея, используя либо пересечение hough линии или обнаружение края, за которым следует обнаружение контуров, а затем выберите самые большие, самые строгие контуры
    • используйте GetPerspectiveTransform, чтобы получить преобразование между координатами изображения и идеальным прямоугольником, затем преобразуйте входное изображение используя WarpPerspective
  • Разделить изображение на каналы R, G и B и выполнить r - avg(g, b), это немного зависит от освещения, но должно дать что-то вроде этого:

    очищено числовое изображение

  • Затем либо попробуйте сопоставление шаблонов на этом, либо, возможно, перегруппируйте изображение и попытайтесь найти, какие сегменты дисплея зажжены, или выполните пакет OCR.