2010-03-10 8 views
5

Y at-il des algorithmes disponibles pour l'analyse de la complexité d'une image? Fondamentalement, je suis en train d'écrire un script Perl qui utilisera la fonction system() pour lancer MPlayer en arrière-plan pour générer 10 à 20 captures d'écran pour le fichier vidéo d'entrée et je voudrais qu'il soit en mesure d'ignorer des images simples comme photo du ciel, ou un fond noir, et d'autres images simples et de conserver seulement 3 de ces images avec la plus grande complexité ou le plus grand nombre de couleurs. Y a-t-il un module ou un programme distinct que je peux utiliser pour accomplir ceci? Je suppose que peut-être Image :: Magick peut s'occuper de ça.Analyse complexité de l'image

+4

Vous demandez un algorithme beaucoup plus complexe que vous pensez ... Ce – RedFilter

Répondre

9

Voyez comment petit une copie compressée JPEG est. JPEG travaille dur pour supprimer les redondances dans les informations d'image et les images "complexes" n'ont tout simplement pas autant de redondance à supprimer.

+1

C'est une bonne idée - comparez la taille de l'image bitmap avec la taille du fichier jpeg, plus la différence entre les deux est grande, plus l'image est simple. – Kazar

+0

Cela pourrait fonctionner pour les images photographiques, mais j'ai le sentiment que cela ne ferait pas si bien sur le dessin au trait, le texte, ou d'autres choses que jpeg ne gère pas bien. Cependant, pour ces types d'images, vous pouvez utiliser la même technique avec un png ou un gif. – Seth

+0

Cela fonctionne étonnamment bien, je l'ai utilisé pour choisir la meilleure miniature d'un ensemble de vignettes avant et il est très bien pour se débarrasser des noirs seulement –

0

Vous pourriez envisager de faire un FFT et la recherche d'informations à haute fréquence dans les images ... Cela vous donne une idée approximative de la complexité.

0

Je ne sais pas d'une méthode de bibliothèque ready-made, mais il y a des algorithmes pour mesurer cette ...

Vous pouvez essayer d'additionner les valeurs absolues des différences d'un pixel à l'autre , séparément par canal de couleur. L'image de l'échantillon avec le résultat le plus élevé gagnerait alors. Pourtant, ce serait une très mesure rugueux ...

Bit de pseudo-code, puisque je ne sais pas perl:

complexity = 0 
// image coordinates start at [0,0] 
for x = 1 to image.max_x: 
    for y = 1 to image.max_y: 
     complexity += abs(image[x,y].red - image[x,y-1].red) 
     complexity += abs(image[x,y].red - image[x-1,y].red) 
     complexity += abs(image[x,y].blue - image[x,y-1].blue) 
     complexity += abs(image[x,y].blue - image[x-1,y].blue) 
     complexity += abs(image[x,y].green - image[x,y-1].green) 
     complexity += abs(image[x,y].green - image[x-1,y].green) 
+0

préférera les images « bruyants » à images « d'information-dense ». Considérons un cadre de blanc-bruit/neige. –

+0

D'accord, c'est vrai. Mais dans des cas typiques, cela fonctionnerait également. Le seul film dont je me souviens des images bruyantes serait « The Ring » - et ce cadre serait je pense ;-) Par ailleurs, aperçu assez typique pour le film, vous pouvez aussi mesurer ce que cette algo ne crachent pour une image de bruit blanc et interdire tout ce qui dépasse un seuil un peu au-dessous de cette mesure. Et, pour être juste, cet algo produirait seulement des informations précieuses sur des images qui ont les mêmes dimensions. OTOH, dans l'application mentionnée par le PO, cela serait intrinsèquement le cas. – orithena

1

Ma première réponse serait la méthode JPEG mais quelqu'un l'a déjà suggéré, donc ma prochaine réponse serait de calculer un histogramme ($image->Histogram()). Il suffit de regarder le nombre de couleurs différentes dans l'image. Pour les photos (des choses comme le ciel), plus il y a de couleurs dans une image, plus elle est complexe.

+0

Je ne suis pas d'accord. Les images monochromes/à deux niveaux peuvent être très riches en informations http://obeygiant.com/images/2008/10/obey-floral-red-500x490.jpg .... Vous avez bien dit "photos". –

+0

Joe: C'est pourquoi je l'ai qualifié avec "Pour les photos". Son exemple était "fond noir" ou "ciel", les deux impliquent des photos couleur. En fait, il a même demandé comment compter les couleurs, ce qui est la réponse que j'ai donnée. – Gabe

+0

Eh bien cette image est une photo d'un dessin! Mais oui, je vois ce que vous voulez dire et je suis d'accord que vous avez fourni la solution à la question. –

2

papier Grande here sur le sujet. Il considère le problème plus étroit de l'appariement d'images dans une application militaire, mais étudie la recherche et contient de nombreuses métriques de complexité d'image qui ont été considérées par divers auteurs. Il est possible que vous n'ayez besoin que d'une ou deux méthodes dans votre tâche particulière. Vérifiez-le.