Автоматически распознавать шаблоны на изображениях - PullRequest
8 голосов
/ 15 июля 2010

Недавно я скачал несколько флагов из справочника ЦРУ мира . Теперь я хочу "классифицировать их.

  1. Получить цвета
  2. Получить некоторые фигуры (звезды, луны и т. Д.)

Во время просмотра я наткнулся на библиотеку изображений Python, которая позволяет мне извлекать цвета (например, для Австрия :

#!/usr/bin/env python
import Image
bild = Image.open("au-lgflag.gif").convert("RGB")
bild.getcolors()
[(44748, (255, 255, 255)), (452, (236, 145, 146)), (653, (191, 147, 149)), ...)]

Что мне показалось странным, так это то, что австрийский флаг содержит только два цвета, но в приведенном выше выводе отображается более десяти. Ты знаешь почему? Моя идея состояла в том, чтобы считать только 5 верхних цветов, и поскольку я не заинтересован в каждом цвете, я бы немного "нормализовал" числа, кратные 64 (поэтому (236, 145, 146) становится 192, 128, 128)).

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

Заранее спасибо

Ответы [ 2 ]

9 голосов
/ 15 июля 2010

Библиотека изображений Python - PIL просто выполняет базовые операции с изображениями - открытие, некоторые преобразования или фильтры и сохранение в других форматах.

Распознавание образов, является частью усовершенствованного поля обработки изображений и развивается - оно использует алгоритмы, значительно отличающиеся от тех, которые присутствуют в PIL.

Есть некоторые библиотеки и фреймворки, которые вы можете использовать в Python для распознавания образов - (распознавание звезд, лун и т. Д.) - Хотя я вас опередил: если вы хотите, чтобы это просто классифицировало «один на один» coutnry flags, вы должны делать это вручную, а не пытаться погрузиться в распознавание образов.

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

Таким образом, для менее чем 500 изображений вы можете прибегнуть к программному обеспечению, которое позволяет помечать изображения вручную и писать код для привязки тегов к каждому флагу.

Что касается цветов: растровые изображения компьютера формируются из пикселей. Это площадь. На границе между разными цветами, если пиксель имеет один цвет (скажем, белый), а его сосед - совершенно другой цвет (например, красный), эта граница будет отображаться неровной. Это известно как «псевдонимы». Чтобы уменьшить это, компьютерное программное обеспечение смешивает цвета на жестких границах, создавая промежуточные цвета - вот почему PNG даже с двумя видимыми цветами может иметь несколько цветов внутри. Для .JPG это еще хуже, потому что округленные десятичные числа для цветов RGB, которые мы используем, даже не сохраняются, как они есть на изображении.

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

def get_main_colors(col_list):
    main_colors = set()
    for index, color in col_list:
        main_colors.add(tuple(component >> 6 for component in color))
    return [tuple(component << 6 for component in color) for color in main_colors]

вызвать его, например, с помощью get_main_colors (bild.get_colors ()).

Вот еще один вопрос, касающийся части распознавания образов: распознавание изображений Python

7 голосов
/ 15 июля 2010

Сначала небольшая терминология, на всякий случай:

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

По вопросу:

Я думаю, что ваша проблема может быть легко решена с помощью простого классификатора, такого как k-ближайшие соседи, с цветными гистограммами в качестве векторов признаков.В частности, я бы использовал векторы функций HSV, а не векторы функций RGB.О некоторых замечательных результатах сообщалось в литературе, использующей именно такую ​​простую систему классификаторов, например: SVM для классификации изображений на основе гистограммы .В этой статье авторы используют определенный классификатор, известный как векторы опорных векторов (SVM) и векторы функций HSV.Векторы функций HSV также обходят проблему масштаба и поворота изображения, например, флаг 1024x768 против 640x480 или флаг, который поворачивается на изображении на 45 градусов.

Псевдокод для обучения алгоритму будет выглядетьчто-то вроде этого:

# training simple kNN -- just compute feature vectors, collect labels
X = []    # tuple (input example, label)
for training_image in data:
    x = get_hsv_vector(training_image)
    y = get_label(training_image)
    X.append((x,y))

# classification -- pick k closest feature vectors 
K = 3     # the 'k' in kNN -- how many similar featvecs to use
d = []    # (distance, label) tuples for scoring
x_test = get_hsv_vector(test_image)    # feature vector to be classified
for x_train in X:
    d.append((distance(x_test[0], x_train), x_test[1])

# sort distances, d, by closeness and pick top K labels for scoring
d.sort()
output = get_majority_vote([x[1] for x in d[:K]])

Классификатор kNN доступен в нескольких пакетах Python с хорошей документацией.Это должно быть довольно легко преобразовать в цветовое пространство HSV также.Если вы не достигли желаемых результатов, вы можете попытаться улучшить свои векторы признаков или свой классификатор.

...