|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : septembre 2012 Messages : 6 ![]() |
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 |
|
|
00
|
|
|
#2 | |
![]() ![]() |
Citation:
Pour faire simple, Il faut donc arrondir, ou tronquer tes coordonnées ou interpoler tout les points se trouvant dans le pixel de destination. |
|
|
|
10
|
|
|
#3 | ||
|
Invité de passage
![]() Inscription : septembre 2012 Messages : 6 ![]() |
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()); Code :
Code :
java.awt.geom.Point2D a = new Point2D.Double(j+gridValues[j],i+gridValues[j]) 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?? |
||
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() Jean-Michel BORLOTFabricant et casseur d'avions Inscription : avril 2004 Messages : 3 215 ![]() |
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! |
|
10
|
|
|
#5 |
![]() ![]() Dinobogan Shelashyningénieur Inscription : juin 2007 Messages : 3 426 ![]() |
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. |
|
|
10
|
|
|
#6 | |||
|
Invité de passage
![]() Inscription : septembre 2012 Messages : 6 ![]() |
Citation:
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 :
Code :
java.awt.geom.Point2D a = new Point2D.Double(j+gridValuesX[j],i+gridValuesY[j]) 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 |
|||
|
|
00
|
|
|
#7 |
![]() ![]() |
Une sorte warping que tu voulais faire, maintenant je comprends mieux, oublie ce que j'ai dit
|
|
|
00
|
|
|
#8 |
![]() ![]() Dinobogan Shelashyningénieur Inscription : juin 2007 Messages : 3 426 ![]() |
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. |
|
|
10
|
|
|
#9 | |
|
Invité de passage
![]() Inscription : septembre 2012 Messages : 6 ![]() |
Citation:
Chaque couleur doit être entièrement recalculée |
|
|
|
00
|
|
|
#10 |
|
Expert Confirmé Sénior
![]() ![]() |
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
__________________
⥀⥁ Чиз 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. |
|
|
10
|
|
|
#11 | |
|
Expert Confirmé Sénior
![]() ![]() Jean-Michel BORLOTFabricant et casseur d'avions Inscription : avril 2004 Messages : 3 215 ![]() |
Citation:
|
|
|
10
|
|
|
#12 | |
|
Invité de passage
![]() Inscription : septembre 2012 Messages : 6 ![]() |
Citation:
|
|
|
|
00
|
|
|
#13 |
|
Expert Confirmé Sénior
![]() ![]() |
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. |
|
|
10
|
Copyright © 2000-2013 - www.developpez.com