2009-05-31 5 views
1

Pour un moteur de vignettes, je voudrais développer un algorithme qui prend x vignettes aléatoires (recadrage, pas de redimensionnement) d'une image, les analyse pour le contraste et choisit celui avec le contraste le plus élevé. Je travaille avec PHP et Imagick mais je serais content pour quelques conseils généraux sur la façon de calculer le contraste de l'imagerie.Comment puis-je choisir une image avec un contraste plus élevé en PHP?

Il semble que beaucoup de choses soient plus faciles que de calculer le contraste, par exemple en comptant les couleurs, en calculant la luminosité, etc.

Quelles sont vos expériences avec l'analyse de matériel d'image?

Répondre

2

que je le ferais de cette façon (pseudocode):

L[256] = {0,0,0...} 

loop over each pixel: 
    luminance = avg(R,G,B) 
    increment L[luminance] by 1 

for i = 0 to 255: 
    if L[i] < C: L[i] = 0  // C = threshold of your chose 

find index of first and last non-zero value of L[] 
contrast = last - first 
+0

Cela me donnerait juste la différence entre le pixel le plus sombre et le plus léger, si je comprends bien votre idée. Pas très représentatif dans la plupart des cas. – markus

+0

http://en.wikipedia.org/wiki/Contrast_(vision) – mateusza

+0

autant que je comprends cet article wiki ce serait un écart-type qui aide. Donc, merci pour le lien, peut-être que vous pouvez ajuster votre pseudo-code pour calculer un écart-type ou une autre métrique de variance. – markus

1

Dans la recherche de l'image « avec le plus grand contraste, » vous devez être très prudent dans la façon dont vous définissez le contraste de l'image. De la manière la plus simple, le contraste est la différence entre l'intensité la plus faible et l'intensité la plus élevée de l'image. Cela ne va pas être très utile dans votre cas. Je suggère que vous utilisiez une approche d'histogramme pour décrire le contraste d'une image donnée, puis comparez les propriétés des histogrammes pour déterminer l'image avec le contraste le plus élevé tel que vous le définissez. Vous pouvez utiliser une variété de conteneurs bien connus pour représenter l'histogramme dans le code, ou construire une classe pour répondre à vos besoins spécifiques. (Je ne veux pas dire que vous devez créer un histogramme sous la forme d'un graphique - juste une représentation statistique des valeurs d'intensité.) Vous pouvez utiliser directement la variance de chaque histogramme comme mesure de contraste ou utiliser l'écart-type si c'est plus facile de travailler avec.

La clé réside vraiment dans la façon dont vous définissez le contraste de l'image. En général, je définirais une image à fort contraste comme une image avec des valeurs présentes pour toutes ou presque toutes les valeurs possibles. Et j'ajouterais que dans cette définition d'une image à contraste élevé, les valeurs d'intensité de l'image auront tendance à être réparties uniformément sur l'ensemble des valeurs possibles. En utilisant cette approche, une image à faible contraste aurait tendance à avoir relativement peu de valeurs d'intensité discrètes et aurait tendance à être étroitement groupée plutôt qu'à être uniformément distribuée. (En règle générale, ils auront également tendance à être groupés vers le centre de la gamme.)

Questions connexes