6

Recientemente descargué algunas banderas del CIA world factbook. Ahora quiero "clasificarlos.Reconocer automáticamente los patrones en las imágenes

  1. Obtener los colores
  2. Obtener algunas formas (estrellas, lunas, etc.)

Mientras explora me encontré con la biblioteca de imágenes de Python que me permite extraer los colores (es decir, para Austria:

#!/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)), ...)] 

lo que me pareció extraño aquí es que la bandera austríaca tiene solamente dos colores en ella, pero la salida de arriba muestra más de diez ¿sabe usted. ¿por qué? Mi idea era contar solo los 5 primeros colores y como no estoy interesado en cada color, haría un poco de "normalizar" los números a múltiplos de 64 (entonces (236, 145, 146) se convierte en (192, 128, 128)).

Sin embargo, por el momento no tengo idea de cuál es la mejor forma de extraer más información (¿hay una estrella en la imagen?). ¿Podría darme algunos consejos sobre cómo hacerlo?

Gracias de antemano

+4

Es la CIA. Tal vez hayan usado la esteganografía para codificar mensajes secretos en las imágenes de la bandera al modificar sutilmente los colores ... y ahora lo han comentado aquí. ¡CORRER! –

+6

Bueno, mientras estoy leyendo esto, hay una camioneta deteniéndose frente a mi puerta. Oh, qué es $ &% $ & Connection perdido – qbi

Respuesta

8

El Python Imaging Library - PIL sólo lo hace la manipulación de imagen básica - de apertura, algunas transformadas o filtros, y guardar en otros formatos.

Reconocimiento de patrones, es parte de un campo avanzado de procesado de imágenes y evoluciona - deos utiliza algoritmos muy diferentes a los presentes en PIL.

Hay algunas bibliotecas y marcos que puede usar en Python para el reconocimiento de patrones (reconocimiento de estrellas y lunas, etc.). Aunque lo adelanto: si lo desea, solo para clasificar one0-hundered-and-a- pocas banderas de coutnry, deberías hacerlo manualmente, en lugar de intentar bucear en reconocimiento de patrones.

Su comentario sobre la cantidad de colores indica que no se usa en absoluto con imágenes de computadora. Y el reconocimiento de patrones es hardcore, incluso con un front-end python. (No se puede esperar que un marco actual sepa de antemano qué es una "luna" o una "estrella", por ejemplo)

Entonces, para menos de 500 imágenes, puede recurrir a un software que le permite etiquetar imágenes manualmente y escribe un código para vincular las etiquetas a cada bandera.

En cuanto a los colores: Las imágenes rasterizadas por ordenador están formadas por píxeles. Estos son cuadrados En el límite entre diferentes colores, si un píxel está en un color (por ejemplo, blanco) y su vecino es un color completamente diferente (como el rojo), este límite aparecerá irregular. Esto se conoce como "aliasing". Para disminuir esto, el software de computadora mezcla colores en límites difíciles, creando colores intermedios, es por eso que un PNG incluso con 2 colores aparentes puede tener varios colores internamente. Para .JPG es aún peor, porque los números decimales redondeados para los colores RGB que usamos ni siquiera están almacenados como están en la imagen.

A diferencia del reconocimiento de patrones, puede reducir el tamaño de los colores vistos utilizando solo los bits más significativos de cada componente. Yo diría que los dos bits más significativos serían suficientes. La siguiente función pitón podría hacer que el uso de un color dado por recuento 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] 

llamada con "get_main_colors (bild.get_colors())", por ejemplo.

Aquí es otra cuestión se trata de la parte de reconocimiento de patrones: python image recognition

6

Primera cierta terminología rápida, por si acaso:

Un clasificador aprende un mapa de entradas a salidas. Entrena un clasificador dándole pares de entrada/salida, por ejemplo, vectores de características como información de color y etiquetas como 'bandera checa'. En la práctica, las etiquetas se representan como números escalares. En su ejemplo, tiene un problema de clase múltiple, lo que simplemente significa que hay más de dos etiquetas posibles (obviamente, dado que hay más de dos banderas de países). El entrenamiento de un clasificador de múltiples clases puede ser un poco más complicado que el clasificador binario de vanilla, por lo que es posible que desee buscar términos como "clasificador de múltiples clases" o "clasificador de uno contra muchos" para investigar cuál es el mejor enfoque para usted.

En al problema:

Creo que su problema puede ser fácilmente resuelto mediante un clasificador simple, como k-vecinos más cercanos, con histogramas de color como vectores de características. En particular, usaría vectores de características HSV en lugar de vectores de características RGB. Se han reportado algunos excelentes resultados en la literatura usando solo este tipo de sistema clasificador simple, por ejemplo: SVMs for Histogram-Based Image Classification. En ese documento, los autores utilizan un clasificador particular conocido como Support Vector Machine (SVM) y vectores de características HSV. Los vectores de características de HSV también evitan el problema de la escala y rotación de la imagen, por ejemplo, una bandera que es 1024x768 frente a 640x480, o una bandera que se gira en una imagen en 45 grados.

El pseudocódigo para entrenar el algoritmo sería algo como esto:

# 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]]) 

El clasificador kNN está disponible en varios paquetes de Python, con una buena documentación. También debería ser bastante fácil convertir al espacio de color HSV. Si no logra los resultados deseados, puede intentar mejorar sus vectores de características o su clasificador.

Cuestiones relacionadas