Автоматически распознайте шаблоны в изображениях

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

  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)).

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

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

9
задан qbi 14 July 2010 в 22:34
поделиться

2 ответа

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

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

Есть несколько библиотек и фреймворков, которые вы можете использовать в Python для распознавания образов - (распознавание звезд, лун и т. Д.) - Хотя я вас продвигаю: если вы хотите, чтобы это просто классифицировало один0 сотен и несколько 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

8
ответ дан 4 December 2019 в 13:44
поделиться

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

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

Переходя к проблеме:

Я думаю, что вашу проблему можно легко решить с помощью простого классификатора, например, 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. Если вы не достигли желаемых результатов, вы можете попытаться улучшить свои векторы признаков или свой классификатор.

7
ответ дан 4 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: