Précédent   Forum du club des développeurs et IT Pro > Java > Interfaces Graphiques en Java > Graphisme > 2D
2D Forum d'entraide pour le dessin et le graphisme 2D (Java2D, JFreeChart, JGraph, JFreeReport, Chart2D, JChart2D, jCharts, JDrawing, ...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 29/12/2012, 23h51   #1
sigga
Invité de passage
 
Femme
Inscription : septembre 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2012
Messages : 6
Points : 1
Points : 1
Par défaut Coordonnées des pixels de type double

bonjours à tous
comment faire pour représenter des images 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
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
maintenant je dois construire et afficher une image resultat de l'interpolation
merciiii
sigga est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 14h35   #2
wax78
Modérateur
 
Avatar de wax78
 
Homme Renaud Warnotte
Développeur informatique
Inscription : août 2006
Messages : 2 137
Détails du profil
Informations personnelles :
Nom : Homme Renaud Warnotte
Âge : 32
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2006
Messages : 2 137
Points : 4 085
Points : 4 085
Envoyer un message via MSN à wax78
Citation:
Envoyé par sigga Voir le message
comment faire pour représenter des images avec des coordonnées de pixel de type double?
Un pixel sur l'écran est un pixel, il se calcul en entier, et non en double ou autres.
Pour faire simple, Il faut donc arrondir, ou tronquer tes coordonnées ou interpoler tout les points se trouvant dans le pixel de destination.
wax78 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/01/2013, 16h14   #3
sigga
Invité de passage
 
Femme
Inscription : septembre 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2012
Messages : 6
Points : 1
Points : 1
je vous remercie wax78 pour votre réponse..
mais en effet j'ai deux tableaux de données
le premier tableau de type int, et contient les valeurs de pixels RGB

Code :
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

Code :
1
2
3
4
5
6
7
8
9
10
11
12
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 * 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:
Code :
java.awt.geom.Point2D a = new Point2D.Double(j+gridValues[j],i+gridValues[j])
et le cast peut provoquer une perte de précision
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
comment faire pour résoudre ce problème??
sigga est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 16h45   #4
plegat
Expert Confirmé Sénior
 
Jean-Michel BORLOT
Fabricant et casseur d'avions
Inscription : avril 2004
Messages : 3 215
Détails du profil
Informations personnelles :
Nom : Jean-Michel BORLOT
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Fabricant et casseur d'avions
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : avril 2004
Messages : 3 215
Points : 5 378
Points : 5 378
Salut

Citation:
Envoyé par sigga Voir le message
comment faire pour résoudre ce problème??
Prendre le problème à l'envers!

Là, tu as interpolé les pixels de l'image de départ pour tenter de les positionner sur l'image d'arrivée. Pourquoi ne pas plutôt faire l'inverse? Tu prends les pixels de l'image d'arrivée, et tu vas chercher à quel pixel de l'image de départ ça correspond. Et si ça tombe entre deux pixels, tu interpoles... mais sur l'image de départ!
__________________
"Errare humanum est, sed perseverare diabolicum"

Ma page sur DVP.com
plegat est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/01/2013, 17h26   #5
dinobogan
Modérateur
 
Avatar de dinobogan
 
Homme Dinobogan Shelashyn
ingénieur
Inscription : juin 2007
Messages : 3 426
Détails du profil
Informations personnelles :
Nom : Homme Dinobogan Shelashyn
Âge : 32
Localisation : France

Informations professionnelles :
Activité : ingénieur
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2007
Messages : 3 426
Points : 5 547
Points : 5 547
Pour ta valeur en double 25.6236, tu prends 62% (valeur après virgule) de la case 26 et 38% (1 - valeur_apres_virgule) de la case 25 sur toutes tes composantes RGB.

Il faut voir la valeur double comme une valeur intermédiaire entre deux cases. Pour 0.5, se sera la moyenne entre les deux cases (la moitié de la première et la moitié de la seconde).
__________________
Que la force de la puissance soit avec le courage de ta sagesse.
dinobogan est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/01/2013, 12h12   #6
sigga
Invité de passage
 
Femme
Inscription : septembre 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2012
Messages : 6
Points : 1
Points : 1
Citation:
Envoyé par plegat Voir le message
Salut



Prendre le problème à l'envers!

Là, tu as interpolé les pixels de l'image de départ pour tenter de les positionner sur l'image d'arrivée. Pourquoi ne pas plutôt faire l'inverse? Tu prends les pixels de l'image d'arrivée, et tu vas chercher à quel pixel de l'image de départ ça correspond. Et si ça tombe entre deux pixels, tu interpoles... mais sur l'image de départ!
je vous remercie plegat pour votre réponse mais je n'ai pas bien compris ce que vous vouliez dire, comment inverser le problème?
peut être mon problème n'été pas bien expliqué au debut
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 icithin 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

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
Code :
java.awt.geom.Point2D a = new Point2D.Double(j+gridValuesX[j],i+gridValuesY[j])
comment faire pour afficher cette image?
wax78 me propose 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
sigga est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 12h30   #7
wax78
Modérateur
 
Avatar de wax78
 
Homme Renaud Warnotte
Développeur informatique
Inscription : août 2006
Messages : 2 137
Détails du profil
Informations personnelles :
Nom : Homme Renaud Warnotte
Âge : 32
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2006
Messages : 2 137
Points : 4 085
Points : 4 085
Envoyer un message via MSN à wax78
Une sorte warping que tu voulais faire, maintenant je comprends mieux, oublie ce que j'ai dit
wax78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 16h57   #8
dinobogan
Modérateur
 
Avatar de dinobogan
 
Homme Dinobogan Shelashyn
ingénieur
Inscription : juin 2007
Messages : 3 426
Détails du profil
Informations personnelles :
Nom : Homme Dinobogan Shelashyn
Âge : 32
Localisation : France

Informations professionnelles :
Activité : ingénieur
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2007
Messages : 3 426
Points : 5 547
Points : 5 547
As-tu testé ma technique ?
Ce n'est pas un "simple" déplacement de pixel. Chaque couleur doit être entièrement recalculée.
__________________
Que la force de la puissance soit avec le courage de ta sagesse.
dinobogan est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/01/2013, 23h01   #9
sigga
Invité de passage
 
Femme
Inscription : septembre 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2012
Messages : 6
Points : 1
Points : 1
Citation:
Envoyé par dinobogan Voir le message
As-tu testé ma technique ?
Ce n'est pas un "simple" déplacement de pixel. Chaque couleur doit être entièrement recalculée.
je vous remercie dinobogan pour votre réponse, mais j'ai pas compris ce que vous voulez dire par on prends 62% (valeur après virgule) de la case 26 et 38% (1 - valeur_apres_virgule) de la case 25 sur toutes tes composantes RGB. et
Chaque couleur doit être entièrement recalculée
sigga est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 10h50   #10
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 280
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 280
Points : 32 756
Points : 32 756
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
D'abord, tu ne dois pas regarder à quel pixel de l'image d'arrivée correspond un pixel de l'image de départ, mais l'inverse. Sinon, dans ton calcul, tu aura inévitablement des trous.

Imagine que 4;4 au départ corresponde à 3.2;4 à l'arrivée et que 5;4 corresponde 6.5;4, que mettre en 4;4 et 5;4 sur l'image d'arrivée? Ces points ne sont jamais calculés.
Donc ton algorithme doit être l'inverse, puisque le but est de construire chaque pixel de l'image d'arrivée.

pour chaque pixel de l'image d'arrivée
  • calculer la paire de double qui correspond à l'image de départ:
  • calculer la valeur de la couleur de cette position en interpolant à partir des pixels entourant ce point (il est à une certaine distance des 4 pixels l'entourant, pondérer en fonction des distance)
  • appliquer cette couleur à l'image d'arrivée.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/01/2013, 15h22   #11
plegat
Expert Confirmé Sénior
 
Jean-Michel BORLOT
Fabricant et casseur d'avions
Inscription : avril 2004
Messages : 3 215
Détails du profil
Informations personnelles :
Nom : Jean-Michel BORLOT
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Fabricant et casseur d'avions
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : avril 2004
Messages : 3 215
Points : 5 378
Points : 5 378
Citation:
Envoyé par tchize_ Voir le message
Donc ton algorithme doit être l'inverse, puisque le but est de construire chaque pixel de l'image d'arrivée.

pour chaque pixel de l'image d'arrivée
  • calculer la paire de double qui correspond à l'image de départ:
  • calculer la valeur de la couleur de cette position en interpolant à partir des pixels entourant ce point (il est à une certaine distance des 4 pixels l'entourant, pondérer en fonction des distance)
  • appliquer cette couleur à l'image d'arrivée.
Voila, c'est ça que je voulais dire... mais _tchize l'a dit mieux que moi!
__________________
"Errare humanum est, sed perseverare diabolicum"

Ma page sur DVP.com
plegat est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2013, 16h47   #12
sigga
Invité de passage
 
Femme
Inscription : septembre 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2012
Messages : 6
Points : 1
Points : 1
Citation:
Envoyé par tchize_ Voir le message
D'abord, tu ne dois pas regarder à quel pixel de l'image d'arrivée correspond un pixel de l'image de départ, mais l'inverse. Sinon, dans ton calcul, tu aura inévitablement des trous.

Imagine que 4;4 au départ corresponde à 3.2;4 à l'arrivée et que 5;4 corresponde 6.5;4, que mettre en 4;4 et 5;4 sur l'image d'arrivée? Ces points ne sont jamais calculés.
Donc ton algorithme doit être l'inverse, puisque le but est de construire chaque pixel de l'image d'arrivée.

pour chaque pixel de l'image d'arrivée
  • calculer la paire de double qui correspond à l'image de départ:
  • calculer la valeur de la couleur de cette position en interpolant à partir des pixels entourant ce point (il est à une certaine distance des 4 pixels l'entourant, pondérer en fonction des distance)
  • appliquer cette couleur à l'image d'arrivée.
Je vous remercie tchize pour votre réponse; mais si vous me donnez un petit exemple illustratif pour bien comprendre je vous serais très reconnaissante
sigga est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 17h07   #13
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 280
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 280
Points : 32 756
Points : 32 756
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
prenons un exemple simple, un zoom x3.


4;4 sur l'image d'arrivée correspond à 1.333;1.333 (4/3;4/3) sur l'image de départ.

Ce qui donne ça à peu près

Reste à calculer la couleur de X, qui sera une valeur pondérée de A,B,C et D.
Pour l'interpolation, tu as une chiée d'algorithmes, à toi de prendre celui qui te convient.

Le plus naif, le "nearest point", X = A
Après tu as les interpolations Bilinéaire
X = (A*2/3+B*1/3) *2/3 + (C*2/3+D*1/3)*1/3
les bicubiques, etc
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h05.


 
 
 
 
Partenaires

Hébergement Web