Image avec des coordonnées de type double

dadita - 30 déc. 2012 à 09:22
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 4 janv. 2013 à 13:54
bonjours à tous
comment faire pour représenter une image avec des coordonnées de pixel de type double?
c'est à dire une image construite à partir des points comme
java.awt.geom.Point2D a = new Point2D.Double(13.1258,85.36985);

en effet j'ai deux tableaux de données
le premier tableau de type int, et contient les valeurs de pixels RGB
int[] pixels = image.getRGB(0,0, image.getWidth(), image.getHeight(), null, 0, image.getWidth());

j'ai un autre tableau de type double et contient les coordonnées des pixels de l'image originale après l'application d'une interpolation
 gridValues = new Double[(xNumCells) * (yNumCells)];

        for (int i = 0; i < yNumCells; i++) {
            for (int j = 0; j < xNumCells; j++) {
// les points dp sont les points de l'image originale avec des coordonnées de type int (j,i)
// getValue() est la fonction d'interpolation
            	Point dp = new Point(j,i);
            	int index = (i * (1 + xNumCells)) + j;
            	double value =  getValue(dp);
                gridValues[index] = value;
            }
        }

maintenant je dois construire et afficher une image resultat de l'interpolation, avec les coordonnées:
java.awt.geom.Point2D a = new Point2D.Double(j+gridValues[j],i+gridValues[j])

merciiii

5 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
2 janv. 2013 à 09:07
Salut,

Les pixels n'ont pas des coordonnées de type double, tu dois donc utiliser des int.

Tu peux les caster en int et ca ira je pense.
0
je vous remercie Julien39 pour votre réponse..
mais un cast peut provoquer une perte de précision
j'ai deux tableaux:

tableau des pixels: 255 189 200 120
tab des coordonnées après interpolation: 25.6236 25.856 23.658 21.548

avec un cast on obtient les valeurs suivants

tableau des pixels: 255 189 200 120
tab des coordonnées après interpolation: 25 25 23 21

la position 25 dans le tab des coordonnées peut avoir deux valeurs 255 et 189
quelqu'un aurait-il une piste de réponse?
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 janv. 2013 à 08:57
Et tu devrais avoir quoi ?

Je ne comprend pas ton problème ?
0
Désolé de ne pas être assez explicite. Voici mon problème complet
j'ai une image I0, et je doit la déformer avec la méthode d'interpolation thin plate spline (spline plaque mince)
thin plate spline permet de déformer l'image en définissant un ensemble des points de contrôle et leurs positions de destination, puis les points de contrôle sont déplacés vers les positions souhaitées.
X = x+dx
Y = y+dy
(x,y): les coordonnées de l'image source(I0)
(X,Y): les coordonnées de l'image resultat(I1) après déformation




Le gros avantage de cet algorithme est que l'image après transformation semble très naturel, une explication simple sur la méthode thin plate spline peut être vu ici
thin plate spline

maintenant le problème
le résultat de l'interpolation est un tableau de double, il contient les valeurs dx dans le cas d'une interpolation selon l'axe des x ou bien les valeurs dy dans le cas d'une interpolation selon l'axe des y
alors, les coordonnées de l'image résultat I1(X,Y) seront aussi de type double :
X x+dx (int + double double)
Y = y+dy

gridValues = new Double[(xNumCells) * (yNumCells)];

        for (int i = 0; i < yNumCells; i++) {
            for (int j = 0; j < xNumCells; j++) {
// les points dp sont les points de l'image originale avec des coordonnées de type int (j,i)

            	Point dp = new Point(j,i);
            	int index = (i * (1 + xNumCells)) + j;
// getValue() est la fonction d'interpolation
            	double value =  getValue(dp);
// gridValuesX est le tableau qui contient le résultat de l'interpolation selon l'axe des X
                gridValuesX[index] = value;
            }
        }

les coordonnées de l'image résultat sont comme suite
java.awt.geom.Point2D a = new Point2D.Double(j+gridValuesX[j],i+gridValuesY[j])

comment faire pour afficher cette image?
vous me proposer de faire un cast de double à int, dans ce cas nous seront confronté à un autre problème,
dans une image chaque pixel(x,y) doit avoir une seule valeurs RGB comme suite



mais avec le cast un pixel(x,y) peut avoir plus q'une seule valeur RGB comme le pixel 25 ici



comment résoudre ce problème?
j'espère que le problème est bien expliqué maintenant
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 janv. 2013 à 13:54
Ok, je comprend ton problème.

Il y a très certainement une solution mais tu ne peux pas afficher des images avec un indice double pour les pixels.

Je pense qu'il faudrait que le dx soit un int.

Le mieux est certainement de créer un système de conversion entre tes doubles et tes int pour t'en sortir. C'est selon moi la seule solution qui ne te fasse pas perdre dde qualité sur ton imagE.
0
Rejoignez-nous