2012-06-25 1 views
0

Je travaille dans un projet où chaque utilisateur a un gros avatar et une vignette de cet avatar. L'avatar est 150x215 et la vignette est 50x50. Pour générer la vignette, l'utilisateur sélectionne une zone carrée à l'intérieur de l'avatar et le système recadre et redimensionne l'avatar pour générer la vignette.Localiser une sous-image redimensionnée à l'intérieur d'une image

Maintenant, j'ai besoin d'une vignette 70x70. Je ne peux pas redimensionner la vignette 50x50 car elle n'est pas belle. Mon idée était de créer un outil pour trouver la vignette à l'intérieur de l'avatar et, en utilisant l'emplacement de la vignette, générer la nouvelle image 70x70. Cela fonctionnait bien jusqu'à ce que je remarque que certaines vignettes ne sont pas seulement recadrées, elles sont redimensionnées. Lorsque l'image est redimensionnée, elle perd des pixels ce qui rend une comparaison pixel par pixel impossible (donc je ne peux pas détecter l'emplacement de la vignette à l'intérieur de l'avatar).

Est-il possible d'identifier l'emplacement de la vignette (même si elle est redimensionnée)? J'utilise EMGU pour gérer les images.

Merci pour toute aide

+0

Je suppose que vous n'avez pas stocké les coordonnées que l'utilisation a choisi en premier lieu? – Slugart

+0

Oui, vous avez raison. L'emplacement n'est pas stocké. L'idée de comparer la vignette à l'avatar était d'obtenir cet emplacement – JSBach

Répondre

1

[EDIT1]

voir votre note, si vous aviez les facteurs d'échelle appliqués à l'avatar d'origine, vous pouvez ensuite créer une vignette temporaire qui a le même facteur d'échelle appliqué, puis effectuez un contrôle d'équivalence statistique de la vignette par rapport à l'avatar déjà mis à l'échelle. Ce à quoi cela ressemblerait serait de trouver l '"image de différence" de la vignette par rapport à l'image de l'avatar mis à l'échelle pour chaque emplacement que la vignette peut éventuellement contenir dans l'avatar. pour chacune de ces "différences", ajoutez toutes les différences basées sur les pixels en une seule différence numérique combinée et stockez-la dans un tableau 2D dimensionné à la dimension des emplacements x et y. La vignette peut éventuellement être placée dans l'image avatar mise à l'échelle. En effet, elle sera plus petite que la taille totale de l'image de l'avatar, en fait, elle sera width = avatarWidth - thumbWidth et height = avatarHeight - thumbHeight). Après avoir calculé toutes les occurrences de différences uniques pour ce tableau 2D, trouvez simplement la min dans le tableau et c'est l'emplacement du pixel en haut à gauche dans l'avatar mis à l'échelle à utiliser. Vous devrez bien sûr prendre en compte la nouvelle taille du pouce 50 x 50 lorsque vous saisirez votre 70 x 70 à partir de ce point en haut à gauche. Vous ne devez (en passant) pas stocker ce tableau 2D de valeurs de différence, Vous pouvez simplement maintenir un emplacement min qui est initialisé avec la valeur du premier emplacement testé, et seulement mettre à jour si l'emplacement actuel est inférieur à le min. actuel Cela éviterait le stockage supplémentaire de la matrice.

[ORIGINAL] Une fois l'image de l'avatar a été redimensionnée, il a également été interpolées, ce qui, à toutes fins intensives signifie que les informations de pixels d'origine a été changé de façon irréversible mathmatically. Vous aurez peut-être plus de chance d'entrer dans le code original de la vignette, et de changer la vignette pour saisir la sous-image de 70 x 70 px, puis de créer le 50 x 50 en recadrant 10 px de chaque côté !!! Cela suppose que vous avez toujours besoin des miniatures 50 x 50 et 70 x 70.

+0

Oui, c'est vrai et bon pour les nouveaux utilisateurs, mais j'ai besoin de gérer les avatars de l'utilisateur plus âgé :( – JSBach

+0

Découvrez la vérification !!! Cependant, vous n'aurez probablement "jamais" une valeur de différence de zéro, donc vous ne devez pas forcément vous attendre à cela, vous devrez peut-être aussi vérifier les valeurs de différence négatives – trumpetlicks

+0

Oui, malheureusement je n'ai pas: si l'utilisateur sélectionne un 20x20 zone, il est redimensionné à 50x50.Si l'utilisateur sélectionne une zone 100x100, il est également redimensionné à 50x50. Cela arrive à n'importe quelle taille de zone, donc je ne sais même pas si l'image a été redimensionnée pour devenir plus grande ou plus petite que la zone sélectionnée :( Je commence à penser que ce n'est pas faisable dans le délai que j'ai :( Merci de toute façon :) – JSBach

Questions connexes