2009-03-24 5 views
3

J'utilise Python et PIL.Comment vérifier si une image RVB ne contient qu'une seule couleur?

J'ai des images en RVB et j'aimerais savoir celles qui ne contiennent qu'une seule couleur (disons # FF0000 par exemple) ou quelques couleurs très proches (# FF0000 et # FF0001).

Je pensais utiliser l'histogramme mais il est très difficile de trouver quelque chose avec les 3 bandes de couleurs, donc je cherche un algorithme plus intelligent.

Des idées?

Le module ImageStat est LA solution! Merci Aaron. J'utilise ImageStat.var pour obtenir la variance et cela fonctionne parfaitement.

Voici mon morceau de code:

from PIL import Image, ImageStat 

MONOCHROMATIC_MAX_VARIANCE = 0.005 

def is_monochromatic_image(src): 
    v = ImageStat.Stat(Image.open(src)).var 
    return reduce(lambda x, y: x and y < MONOCHROMATIC_MAX_VARIANCE, v, True) 

Répondre

4

Essayez le ImageStat module. Si les valeurs renvoyées par extrema sont les mêmes, vous n'avez qu'une seule couleur dans l'image.

0

D'abord, vous devez définir une distance entre deux couleurs. Ensuite, il vous suffit de vérifier pour chaque pixel que sa distance à votre couleur est assez petite.

+0

Calculer la distance euclidienne entre chaque pixel dans l'espace RGB à 3 dimensions est théoriquement correct, mais je pense qu'il ne fonctionnera pas avec des images de plusieurs millions de pixels ... (au moins en Python) –

+0

Pourquoi la distance euclidienne? Vous pouvez imaginer autre chose en fonction de ce que vous voulez. – SmuK

+0

Le problème n'est pas dans le type de distance, mais dans le fait que l'algorithme est O (N^2), N étant le nombre de pixels dans l'image (j'ai cas avec N = 10,000,000) –

0

Voici un petit extrait, vous pouvez utiliser:


import Image 

im = Image.open("path_to_image") 
width,height = im.size 

for w in range(0,width): 
    for h in range(0,height): 
    # this will hold the value of all the channels 
    color_tuple = im.getpixel((w,h)) 
    # do something with the colors here 

Peut-être utiliser un hachage et de stocker les tuples comme la clé et il est certain nombre d'apparitions que la valeur?

Questions connexes