[Java Général] fonction zoom

fonction zoom [Java Général] - Java - Programmation

Marsh Posté le 10-03-2003 à 22:48:03    

Bonjour,  
 
J'ai à ma disposition un tableau de byte, chaque case contenant les valeurs d'un pixel d'une image de vidéo. Je voudrai prendre une partie de ce tableau pour l'agrandir en dupliquant les pixels.  
La contrainte c'est qu'il faut que le tableau d'arrivé est la même taille que le tableau d'origine. Avez-vous une idée, un algo pour réaliser cela?  
Merci d'avance!

Reply

Marsh Posté le 10-03-2003 à 22:48:03   

Reply

Marsh Posté le 10-03-2003 à 22:50:05    

donc en gros tu veux afficher 2 fois plus de pixels que sur l'image originale en en utilisant pas plus, c'est ça? [:taichetoz]


Message édité par the real moins moins le 10-03-2003 à 22:50:47

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-03-2003 à 22:59:45    

il se pourrait tres bien que je n'ai pas du tout compris (je suis pas tres fut-fut), pas la peine de s'exciter hein :D


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-03-2003 à 23:01:02    

the real moins moins a écrit :

je suis pas tres fut-fut)


 
je garde ca en souvenir :whistle:

Reply

Marsh Posté le 10-03-2003 à 23:02:09    

HappyHarry a écrit :


 
je garde ca en souvenir :whistle:

:D
moi je le sais au moins :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-03-2003 à 23:40:13    

the real moins moins a écrit :

:D
moi je le sais au moins :o


 
:fuck:

Reply

Marsh Posté le 11-03-2003 à 00:02:45    

lol nan c'est pas tout à fait ca :-) je prends une sous partie z du tableau x. Il faudrait que le tableau z est la même taille que le tableau original x en duppliquant les valeurs de z. ceci pour créer un effet de zoom ;) j'ai été assez clair la? :-)

Reply

Marsh Posté le 11-03-2003 à 00:05:29    

ben euh tu fais une bete boucle quoi [:spamafote]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 11-03-2003 à 00:17:36    

lol si c'était si simple je serai preneur :) le problème c'est trouver le nombre de pixels que tu dois duppliquer et dans quel proportions...

Reply

Marsh Posté le 11-03-2003 à 00:19:52    

ha euh ok j'etais parti sur l'idée que tu faisais du 200%
 
bah regle de 3 [:spamafote]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 11-03-2003 à 00:19:52   

Reply

Marsh Posté le 11-03-2003 à 00:47:23    

la règle de 3?

Reply

Marsh Posté le 11-03-2003 à 02:37:38    

ben faut faire ta grande matrice de point, et remplir les vides en interpolant, apres, a toi de choisir si tu fais du lineaire, du carre, du cubique etc...
 
y a ca aussi, ca peut peut-etre t'aider :  
 http://www.tsi.enst.fr/tsi/enseign [...] terpol_tv/

Reply

Marsh Posté le 11-03-2003 à 08:54:30    

En gros, tu crées un nouveau tableau de la taille de l'ancien, tu y met les points d'origine de ton image, qui étaient situés dans la zone à agrandir. Par contre, tu ne les metpas n'importe où : il faut les répartir équitablement dans ta nouvelle image.Donc,; si ton image d'origine mesurait "x*y" et que la zone à zoomer mesure "zx*zy", tu met une ligne de points toutes les "(int) y/zy" pixels, et une colonne de pixels tous les "(int) z/zx"  
 
Tu obtiens donc un tableau avec des cases vides, et des pixels "colorés" sur un maillage de "(int) y/zy" pixels en vertical, et "(int) z/zx" en horizontal : il ne te reste donc plus qu'à boucher les trous par interpolation, comme l'a judicieusement suggéré Souk..
 
Le problème, c'est de faire l'interpolation avec un tableau mono-dimensionnel : si ton tableau n'a qu'une 'ligne' pour représenter ton image, tu vas être embêté pour l'interpolation (enfin, pas vraiment, mais au niveau des calculs des indices des cases à utiliser pour calculer la couleur des points environnants, ça va être galère)
 
Ouala ouala.


Message édité par gfive le 11-03-2003 à 09:03:16
Reply

Marsh Posté le 11-03-2003 à 08:56:55    

gfive a écrit :

En gros, tu crées un nouvea


 
Paf, planté ! :D

Reply

Marsh Posté le 11-03-2003 à 09:02:03    

falconn a écrit :

la règle de 3?


c'est un nouvel algo qui vient de sortir :D
 
(c'est pour rigoler, hein)

Reply

Marsh Posté le 11-03-2003 à 09:05:53    

El_gringo a écrit :


 
Paf, planté ! :D


 
mais...mais...beuuuuuh!! J'te mewde, d'abord!! :p
 
(T'en a déjà vu, des argumentations comme ça?? Noooon mais, attends avant 9h du mat, je demande un droit de plantage!)

Reply

Marsh Posté le 11-03-2003 à 09:43:29    

Attention au phénomène de "pixellisation" si le facteur de zoom demandé est trop grand. Je ne sais pas si ce phénomène a du sens dans ton cas, mais s'il en a, il va falloir non pas simplement recopier les valeurs, mais en créer en interpolant les valeurs existantes.

Reply

Marsh Posté le 11-03-2003 à 10:10:50    

c'est un peu ce que gfive a dit non ??

Reply

Marsh Posté le 11-03-2003 à 10:42:24    

pour une interpollation bicubique, y a mon pote google qui m'a trouve ca, y a la formule toute faite pour combler les vides de la grande matrice
 
 http://astronomy.swin.edu.au/~pbourke/colour/bicubic/
 
en esperant que ca t'aide   :hello:

Reply

Marsh Posté le 11-03-2003 à 10:57:51    

benou a écrit :

c'est un peu ce que gfive a dit non ??


Euuh, bah non, je parlais du problème en cas de structure de données à la con :  
 
J'ai vu des gens coder des images comme ça :  
 
[cpp]
byte[] pixels;
int width;
/cpp]  
 
Du coup, le tableau pixels fait width*height cases....Avec un bordel de ce genre, le calcul de la case où mettre une valeur d'interpolation, et celui des cases où prendre les valeurs de base poour l'interpolation est plus prise de tête que l'interpolation elle même, je suis sûr!!
 
Attends....Pour la case i, le pixel du dessus est à la case i-width, le pixel de droite est à i+1, sauf si (i mod (width - 1)) = 0 (bord de droit de l'image)....et width-1 parce que les indices commencent à 0..
 
Bref, le bonheur, quoi!! :p

Reply

Marsh Posté le 11-03-2003 à 11:17:18    

bha ....

Code :
  1. public static byte get(byte[] tab, int x, y, int width) {
  2.    return tab[x + y*width];
  3. }

Reply

Marsh Posté le 11-03-2003 à 11:53:18    

Merci à toi, souk : lL'interpolation bicubique est un algorithme classique très performant (c'est celui qu'on trouve dans Photoshop par exemple), et il marche beaucoup beaucoup mieux qu'une bête interpolation linéaire. A savoir quand même qu'il ne marche bien que jusqu'à un facteur de zoom 4x (2x en largeur, 2 fois en hauteur). Au-delà, l'effet de zoom se voit malgré tout, et il faut passer à des algorithmes beaucoup plus compliqués (genre ce que fait Genuine Fractals), mais là, je doute que tu trouves un algo dans le domaine public : tout doit être soumis à brevet dans tous les sens !  :(  
 
benou> Ton code ne compile pas, il manque un "int" dans le prototype... ;)

Reply

Marsh Posté le 11-03-2003 à 12:16:51    

benou a écrit :


c'est un nouvel algo qui vient de sortir :D
 
(c'est pour rigoler, hein)

:o
n'empeche l'explication de gfive, certes plus comprehensible, est basée sur une regle de 3 :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 11-03-2003 à 15:10:27    

BifaceMcLeOD a écrit :


benou> Ton code ne compile pas, il manque un "int" dans le prototype... ;)


ha oui tiens ... :/

Reply

Marsh Posté le 11-03-2003 à 15:14:53    

BifaceMcLeOD a écrit :

Merci à toi, souk : lL'interpolation bicubique est un algorithme classique très performant (c'est celui qu'on trouve dans Photoshop par exemple), et il marche beaucoup beaucoup mieux qu'une bête interpolation linéaire. A savoir quand même qu'il ne marche bien que jusqu'à un facteur de zoom 4x (2x en largeur, 2 fois en hauteur). Au-delà, l'effet de zoom se voit malgré tout, et il faut passer à des algorithmes beaucoup plus compliqués (genre ce que fait Genuine Fractals), mais là, je doute que tu trouves un algo dans le domaine public : tout doit être soumis à brevet dans tous les sens !  :(  
 
benou> Ton code ne compile pas, il manque un "int" dans le prototype... ;)


 
pour ceux qui ont acces a de la litterature y'a un tres bon article dans graphics gem III pour ce genre de sport. C ce que j'ai utilise pour ma routine et ca me refile de tres bon resultats

Reply

Marsh Posté le 11-03-2003 à 20:58:32    

Hé ben vous êtes super actif sur ce forum :) c'est cool!  
Merci pour votre aide à tous !

Reply

Marsh Posté le 11-03-2003 à 23:06:17    

benou a écrit :

bha ....

Code :
  1. public static byte get(byte[] tab, int x, y, int width) {
  2.    return tab[x + y*width];
  3. }




 
Ah ouais....:D:D Kelkon!! :p

Reply

Marsh Posté le 12-03-2003 à 03:57:03    

gfive a écrit :


 
Ah ouais....:D:D Kelkon!! :p


 
bof, pas tant que ca, moi aussi j'ai toujours les boules de ce genre de chose, c'est tellement facile de se planter  :whistle:

Reply

Marsh Posté le 12-03-2003 à 08:54:36    

the real moins moins a écrit :

:o
n'empeche l'explication de gfive, certes plus comprehensible, est basée sur une regle de 3 :o


 
Ben ouais, mais mon truc sert juste à calculer les positions des points qui serviront de base à l'interpolation.....

Reply

Marsh Posté le 12-03-2003 à 11:55:59    

gfive a écrit :


 
Ben ouais, mais mon truc sert juste à calculer les positions des points qui serviront de base à l'interpolation.....

mais j'ai pas dit que j'avais répondu quelquechose de très intelligent non plus :whistle:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 12-03-2003 à 14:05:52    

the real moins moins a écrit :

mais j'ai pas dit que j'avais répondu quelquechose de très intelligent non plus :whistle:


 
:D:D Et pourtant, on est ni lundi, ni vendredi!! On bosse trop....

Reply

Marsh Posté le 12-03-2003 à 15:09:21    

Sinon pour info, on peut faire ce genre de chose avec l'API standard mais ce sera du bilinéaire (un peu moins bon que le bicubique mais plus rapide).
 
En gros la démarche est la suivante :
 
- créer un WritableRaster à partir de la sélection de l'image de départ (rasterSource)
- créer un second WritableRaster à partir du premier mais avec les dimensions de l'image (rasterDestination)
- créer un objet AffineTransform qui se charge de transformer une image 2D en une autre image 2D (c'est une bête matrice 3x3)
- créer un objet AffineTransformOp qui se chargera d'appliquer le filtre sur rasterSource pour obtenir rasterDestination. C'est là qu'on choisit le mode d'interpolation : nearest neighbor (bof) ou bilinear.
- modifier l'image de départ avec rasterDestination.
 
 
J'avais fait un projet il y a quelques temps qui utilisait tout cela. Si ça t'intéresse je peux coller le code ici.
 
 
Edit: sinon il est sûrement possible de faire du bicubique avec JAI. A vérifier.


Message édité par gm_superstar le 12-03-2003 à 15:10:35

---------------
Incongru : une FAQ abandonnée sur les Standards du Web - FAQ périmée de blabla@Prog
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed