2012-11-08 4 views
0

J'ai fait un script de mosaïque de photos (PHP). Ce script a une image et le transforme en une accumulation de photos de petites images. De loin, il ressemble à la vraie image, quand vous vous rapprochez, vous voyez qu'il s'agit de toutes les petites images. Je prends un carré d'un nombre fixe de pixels et détermine la couleur moyenne de ce carré. Ensuite, je compare cela avec ma base de données qui contient la couleur moyenne de quelques milliers d'images. Je détermine la distance de couleur avec toutes les images disponibles. Mais pour exécuter ce script complètement, cela prend quelques minutes.Antipole Clustering

Le goulot d'étranglement est correspondant à la meilleure image avec une partie de l'image principale. J'ai cherché en ligne comment réduire cela et est venu un croisement "Antipole Clustering". Bien sûr, j'ai essayé de trouver des informations sur la façon d'utiliser cette méthode moi-même, mais je n'arrive pas à comprendre quoi faire.

Il y a deux étapes. 1. Acquisition de base de données et 2. Création de photomosaïque. Commençons par la première étape, quand tout est clair. Peut-être que je comprends l'étape 2 moi-même.

Etape 1:

  • partition chaque image de la base de données en 9 rectangles égaux disposés dans une grille de 3x3

  • calculer les valeurs moyennes RGB pour chaque rectangle

  • construire un vecteur x composée de 27 éléments (trois composantes RVB pour chaque rectangle)

  • x est la fe vecteur ature de l'image dans la structure de données

Eh bien, point 1 et 2 sont faciles, mais que dois-je faire au point 3. Comment puis-je rédiger un vecteur X des 27 composants (9 * R moyenne , G signifie, B signifie.)

Et quand je réussis à composer le vecteur, quelle est la prochaine étape que je dois faire avec ce vecteur.

Peter

Répondre

0

Au lieu d'utiliser RVB, vous pouvez utiliser l'espace HSB. Il donne de meilleurs résultats pour une grande variété de cas d'utilisation. Mettez plus de poids sur Hue pour obtenir de meilleurs résultats de couleur pour les photos ou la luminosité lors de la composition des images à fort contraste (logos, etc.)

Je ne l'ai jamais entendu parler de regroupement antipôle. Mais la prochaine étape évidente serait de mettre toutes les images que vous avez dans un grand index. Dites, un R-Tree. Peut-être charger en vrac via STR. Ensuite, vous pouvez trouver rapidement des correspondances.

0

Peut-être que cela signifie la quantification vectorielle (VQ). En vq, l'image n'est pas subdivisée en rectangles mais en zones de densité. Ensuite, vous pouvez prendre un point moyen de ce cluster. Tout d'abord, vous devez séparer toutes les couleurs et les pixels et les transférer vers un vecteur avec des coordonnées XY. Ensuite, vous pouvez utiliser un cluster de densité comme les cellules voronoï et obtenir le point moyen. Ce point peut vous comparer avec d'autres images dans la base de données. Lisez ici à propos de VQ: http://www.gamasutra.com/view/feature/3090/image_compression_with_vector_.php.

Comment tracer vecteur de pixel adjacent:

 
d(x) = I(x+1,y) - I(x,y) 
d(y) = I(x,y+1) - I(x,y) 

Voici un autre lien: http://www.leptonica.com/color-quantization.html.Mise à jour: Lorsque vous avez déjà calculé la couleur moyenne de votre vignette, vous pouvez procéder et trier tous les moyens couleur dans une carte rgb et en utilisant la formule que je vous donne pour calculer le vecteur x. Maintenant que vous avez un vecteur de toutes vos vignettes, vous pouvez utiliser l'arbre antipole pour rechercher une vignette. C'est possbile parce que l'arbre antipole est quelque chose comme un kd-tree et subdivise l'espace 2D. Lisez ici à propos de l'arbre antipole: http://matt.eifelle.com/2012/01/17/qtmosaic-0-2-faster-mosaics/. Peut-être que vous pouvez demander à l'auteur et télécharger le code source?

+0

J'ai lu quelques articles et vu quelques guides sur VQ maintenant. Si je me trompe, cela fonctionne en divisant un grand nombre de points de densité en groupes ayant approximativement le même nombre de points les plus proches. Chaque groupe obtient un point moyen. Ce que je ne pouvais pas comprendre était de savoir comment passer d'un RVB 3D à un vecteur avec des coordonnées XY. – PHPeter

+0

Mettez à jour ma réponse. J'espère que ça aide. – Bytemain

+0

Désolé, je ne comprends pas votre réponse. Disons que j'ai une photo. Avec le premier pixel 255,255,255 (blanc) et un second pixel 0,0,0 (noir). Comment puis-je obtenir de cette densité? D'où je peux commencer avec VQ. Peut-être connaissez-vous un article ou un autre guide qui explique cela? – PHPeter

1

Voici comment je pense que le vecteur caractéristique est calculée:

Vous avez 3 x 3 = 9 rectangles.

Chaque pixel correspond essentiellement à 3 chiffres, 1 pour chacun des canaux de couleur rouge, vert et bleu.

Pour chaque rectangle, vous calculez la moyenne pour les couleurs rouge, verte et bleue pour tous les pixels de ce rectangle. Cela vous donne 3 nombres pour chaque rectangle.

Au total, vous avez 9 (rectangles) x 3 (moyenne pour R, G, B) = 27 nombres.

Il suffit de concaténer ces 27 nombres en un seul vecteur de 27 par 1 (souvent écrit en 27 x 1). C'est 27 numéros regroupés. Ce vecteur de 27 nombres est le vecteur de caractéristiques X qui représente la statistique de couleur de votre photo. Dans le code, si vous utilisez C++, il s'agira probablement d'un tableau de 27 nombres ou peut-être même d'une instance de la classe de vecteurs (bien nommée). Vous pouvez considérer ce vecteur de caractéristiques comme une sorte de "résumé" de la couleur de la photo. En gros, les choses ressemblent à ceci: [R1, G1, B1, R2, G2, B2, ..., R9, G9, B9] où R1 est la moyenne/moyenne des pixels rouges dans le premier rectangle et ainsi de suite. Je crois que l'étape 2 implique une certaine forme de comparaison de ces vecteurs de caractéristiques de sorte que ceux avec des vecteurs caractéristiques similaires (et donc une couleur similaire) seront placés ensemble. La comparaison impliquera probablement l'utilisation de la distance euclidienne (voir here), ou une autre métrique, pour comparer la similitude entre les vecteurs caractéristiques (et donc la couleur des photos). Enfin, comme le suggère Anony-Mousse, il serait préférable de convertir vos pixels de la couleur RVB à la couleur HSB/HSV. Si vous utilisez OpenCV ou que vous y avez accès, il s'agit simplement d'un code de ligne unique. Sinon, le wiki HSV donnera votre formule mathématique pour effectuer la conversion.

Espérons que cela aide.

+0

IMO l'article sur la compression vectorielle et comment représenter la couleur est v (x) = pixel courant - pixel droit et v (y) = pixel actuel - pixel inférieur. Ensemble, cela fait un v (x, y). Il ne comprend pas vraiment pourquoi un tableau n x 1 ... 27 de nombres concaténés est appelé un vecteur de caractéristiques? Un vecteur est quelque chose avec une direction dans les mathématiques euklides et quand vous le concaténez ce n'est pas un vecteur? – Bytemain

+0

Le mot «caractéristique» est simplement un terme qui est souvent utilisé pour désigner une «statistique» que vous calculez pour décrire/résumer un objet (par exemple, la moyenne, la variance ou tout ce que vous pouvez imaginer). C'est un terme commun dans la vision par ordinateur et l'apprentissage automatique. Essentiellement, en représentant l'image comme un vecteur de caractéristiques, vous le représentez comme un point dans l'espace de dimension n (pas de direction). Le «vecteur» accordé n'est peut-être pas le bon mot au sens mathématique quand il s'agit d'un point, mais c'est le terme qui est utilisé par la communauté de la recherche ... – lightalchemist