Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1623 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Avis pour programme utilisant JAI (Java Advanced Imaging)

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Avis pour programme utilisant JAI (Java Advanced Imaging)

n°1526515
Delantera
Hail Seitan.
Posté le 09-03-2007 à 16:26:38  profilanswer
 

Bonjour!
 
Alors voilà, j'aimerais vos avis avant de me lancer dans un truc de malade pour mon projet! :)
 
Je voudrais donc pouvoir appliquer un traitement sur des pixels d'une image (et non pas sur toute l'image à la fois) ouverte par l'utilisateur. J'ai déja fait mon filechooser avec swing tout ça, mais maintenant je vais utiliser JAI pour le traitement de l'image.
 
Ma question est donc: quelle est la meilleure methode (y'en a à peu près 100000000) pour faire du traitement sur des pixels choisis par l'utilisateur? Je veux dire par là que l'utilisateur cliquera sur l'endroit de l'image qu'il veut traiter, et un traitement sera appliqué sur une zone définie par l'utilisateur (rayon) autour du pixel cliqué.
 
Je veux dire par là, une TiledImage est elle préférable? Si j'ai bien compris une PlanarImage de base ne permet que la lecture! Je suis en train de lire ça, mais c'est énorme:
 
http://java.sun.com/products/java- [...] guide-unc/
 
Je ne demande pas de code, rien de tout ça, juste un petit peu d'aide sur l'organisation à prévoir pour le traitement sur des pixels, car pour moi c'est tout nouveau JAI... J'ai vu que pleins d'opérateurs existaient pour les traitements, mais est-ce possible juste sur des pixels?
 
Autre question, est-il préférable de laisser l'image à 100% avec des scroll, pour que l'utilisateur clique sur l'endroit de l'image qu'il veut traiter, ou bien est-ce possible sur un resize de l'image, et dans ce cas est-ce précis? Je me doute bien que la taille resizée  de l'image de base doit jouer, mais que feriez vous?
 
Bref, vous l'aurez compris, j'ai besoin d'aide...
 
En vous remerciant d'avance, si vous avez besoin d'autres renseignements, je suis toute ouïe...
 
:hello:


Message édité par Delantera le 09-03-2007 à 16:40:12

---------------
500px Be careful when you follow the masses, sometimes the m is silent.
mood
Publicité
Posté le 09-03-2007 à 16:26:38  profilanswer
 

n°1526573
Delantera
Hail Seitan.
Posté le 09-03-2007 à 18:22:30  profilanswer
 

Ou alors, connaitriez-vous un code super bien commenté, ou même un tutorial basique utilistant JAI? Merci!


---------------
500px Be careful when you follow the masses, sometimes the m is silent.
n°1526782
Delantera
Hail Seitan.
Posté le 10-03-2007 à 13:35:00  profilanswer
 

Personne fait de JAI? :cry:


---------------
500px Be careful when you follow the masses, sometimes the m is silent.
n°1529707
Delantera
Hail Seitan.
Posté le 16-03-2007 à 20:22:24  profilanswer
 

Bon, je me permet de reposter, j'ai avancé dans mon projet, j'ai l'interface, et maintenant je voudrais faire le traitement de l'image.

 

En fait ce que je veux faire c'est un logiciel qui traite une image, regarde si  elle a des tâches ( notamment comme des poussières sur un scan de négatif ou des poussières sur le capteur d'un reflex numérique) et corrige ces tâches par des pixels calculés sur une approximation des pixels environnant la tâche.
Oui ça ressemble au tampon de photoshop, et au filtre dust&scratches, c'est ce que je veux reproduire, mais en libre :D

 

Par contre pour la methode, j'hésite!

 

Est-ce que je demande à l'utilisateur de cliquer sur la tâche, et je calcule les nouveaux pixels avec des paramètres rentrés par l'utilisateur? Ou bien j'essaye de detecter les tâches avec des seuils rentrés par l'utilisateur   :??: Je pense par exemple à la transformation de Sobel, y'en a peut-être d'autres?

 

Je me demande si la 2ème possibilité est réellement faisable, peut-être ne me rends-je pas compte de la difficulté de la chose!!!

 

Au final, je devrais calculer les nouveaux pixels remplacant la tâche, je pensais utiliser la matrice de convolution, vous en pensez quoi?

 

Je suis assez perdu concernant la methode, toute aide (même un tout petit peu :)) est bienvenue!

 

En esperant des réponses...

 

:hello:


Message édité par Delantera le 16-03-2007 à 21:12:03

---------------
500px Be careful when you follow the masses, sometimes the m is silent.
n°1529912
Delantera
Hail Seitan.
Posté le 17-03-2007 à 14:09:20  profilanswer
 

Up desesperé...


---------------
500px Be careful when you follow the masses, sometimes the m is silent.
n°1529975
Delantera
Hail Seitan.
Posté le 17-03-2007 à 19:32:59  profilanswer
 

Up :)


---------------
500px Be careful when you follow the masses, sometimes the m is silent.
n°1531887
fahb
Posté le 21-03-2007 à 22:25:44  profilanswer
 

Bonjour,  
je ne suis pas expert quant à la méthode dust&scratches mais je vais essayer d'exposer les méthode que j'utiliserais .
 
 
Si je me souviens bien Sobel va te donner une approximation assez bonne du gradien en 2 passes (la laplacien étant plus exacte en 1 seule passe), ce qui va faire ressortir chaque zone où il y a un changement brusque de couleur (c'est comme ça qu'on calcule les bump map en 3d). De ce fait il est pratiquement impossible de déterminer algorithmiquement ce qui est une tâche parasite ou une tâche "naturelle", sauf faire un arbre de décision tres complexe issu de statistiques poussées (on rentre dans l'IA là ...)
 
Pour la suppression d'une tâche, j'utiliserais une convolution toute simple de flou avec un poid de pixel faible pour chaque pixel ayant un gradient fort ...
 
Pour information tout ceci me parait largement faisable sans JAI, java2D le permettant.
 
 :hello:  

n°1531905
Delantera
Hail Seitan.
Posté le 22-03-2007 à 00:18:23  profilanswer
 

:hello:

 

Merci 1000 fois pour ta réponse!!!!!!!!!!!!!!!!!!

 

Pourrais tu m'expliquer ta phrase "Pour la suppression d'une tâche, j'utiliserais une convolution toute simple de flou avec un poid de pixel faible pour chaque pixel ayant un gradient fort ..." si possible? :D

 

La matrice de convolution je vois, mais je ne comprends pas ce que tu veux dire par un poids de pixel faible? Tu veux dire un pixel avec une couche alpha dont l'opacité est faible?
Et pour le gradient de pixels, tu veux dire quoi? Merci en tout cas.

 

Je vais opter pour la méthode "clic sur la tache sous forme de rond" finalement. Je me suis torturé l'esprit à essayer de penser comment j'allais faire ça, et j'ai pensé à ça:
- Je laisse l'utilisateur choisir le rayon de la tâche.
- Il clique sur la tâche, l'appli regarde les pixels les plus à l'exterieur du cercle cliqué, récupère leur valeur, fait une moyenne de tous ces pixels à l'exterieur, et donne cette même valeur aux pixels plus à l'interieur du cercle, plus éventuellement un flou pour homogeniser le tout...

 

Cela te semble-t-il une bonne méthode? Tu peux le dire si c'est carrément pas bon :D

 

En tout cas merci pour ton aide, c'est vraiment apprécié...

 

Pour ce qui est d'utiliser Java2D, j'ai déjà commencé en JAI, pour le moment j'ai  mon filechooser, j'ouvre l'image et je récupère les coordonnées que l'utilisateur double clique sur l'image (qui est dans un JScrollpane)... Ca parait rapide mais j'y ai mis le temps :D

 

Ce qu'il me reste à faire, juste pour info:

 

- faire l'interface utilisateur des options de "brosse", notamment le rayon, et peut-être autre chose, mais je vois pas pour le moment...
- L'algo de calcul des nouveaux pixels de la tâche, c'est le plus interessant sûrement :)
- un truc qui permet de revenir un pas en arrière
- La sauvegarde de l'image modifiée, qui ma foi n'a pas l'air bien dure, d'après ce que j'en ai vu.

 

Merci encore...

 

:hello:


Message édité par Delantera le 22-03-2007 à 00:21:58

---------------
500px Be careful when you follow the masses, sometimes the m is silent.
n°1533259
fahb
Posté le 24-03-2007 à 21:07:40  profilanswer
 

Voilà, ce que je ferais (ça n'engage que moi):
 
1ère étape:
l'utilisateur sélectionne une ou plusieur "tâches" (avec des carrés c'est plus pratique, mais on peut s'arranger avec des cercles)
 
2ème étape:
Calcul du gradient de l'image, c'est à dire pour faire simple qu'on fait ressortir tout les contours des éléments de l'image en niveau de gris. Les "taches" seront en blanc et les zones uniformes en noir.
Pour cela, il est hors de question de faire une somme de dérivées partielles (trop coûteux en temps), heureusement il existe une bonne approximation avec la matrice de convolution de Laplace : (version la plus simplifié et la plus efficace)
0  -1  0
-1  4  -1
0  -1  0
Il faut voir cela comme une grille de pixels, c'est à dire que chaque pixel recoit une valeur qui est fonction de ces 8 voisins.
Par exemple ici le pixel du centre à un poids de 4 et son voisin à droite un poids de -1.
En somme on se retrouve avec une image de la même taille que celle de départ mais en niveau de gris faisant ressortir les contours.
 
étape 3:
On applique un flou là où l'image des contours est blanche (et correspond à une zone de sélection de l'utilisateur).
Seulement ça ne denera pas un résultat propre, puisque les zones floutées le sont de manière homogènes.
Pour résoudre ce problème, il faut adapter le flou au niveau de gris du pixel qu'on est en train de traiter (images des contours). Si par exemple le pixel est blanc alors il faut augmenter le poids des pixel adjacents dans la matrice de convolution pour le faire disparaitre comme par exemple:
0 1/4 0
1/4 0 1/4
0 1/4 0
inversement si le pixel est noir on met tout ces voisins à 0 et il reste lui-même
s'il est gris, il faut trouver un bon compromis (en normalisant la matrice bien entendu).
 
Voilà j'espère avoir été compréhensible.

n°1533321
EpoK
Let's burn
Posté le 25-03-2007 à 11:05:15  profilanswer
 

Salut,
 
est ce tu pourrais poster un exemple d'image et identifier dessus les "taches" que tu voudrais enlever ?
 
edit : le flou proposé par fab peut être une solution, mais ça va modifier toute ton image avec une impression de flou relativement désagréable pour l'utilisateur. décrit mieux ton problème tu trouveras plus facilement la solution.


Message édité par EpoK le 25-03-2007 à 11:06:46
mood
Publicité
Posté le 25-03-2007 à 11:05:15  profilanswer
 

n°1533367
Delantera
Hail Seitan.
Posté le 25-03-2007 à 15:45:21  profilanswer
 

fahb a écrit :

Voilà, ce que je ferais (ça n'engage que moi):

 

1ère étape:
l'utilisateur sélectionne une ou plusieur "tâches" (avec des carrés c'est plus pratique, mais on peut s'arranger avec des cercles)

 

2ème étape:
Calcul du gradient de l'image, c'est à dire pour faire simple qu'on fait ressortir tout les contours des éléments de l'image en niveau de gris. Les "taches" seront en blanc et les zones uniformes en noir.
Pour cela, il est hors de question de faire une somme de dérivées partielles (trop coûteux en temps), heureusement il existe une bonne approximation avec la matrice de convolution de Laplace : (version la plus simplifié et la plus efficace)
0  -1  0
-1  4  -1
0  -1  0
Il faut voir cela comme une grille de pixels, c'est à dire que chaque pixel recoit une valeur qui est fonction de ces 8 voisins.
Par exemple ici le pixel du centre à un poids de 4 et son voisin à droite un poids de -1.
En somme on se retrouve avec une image de la même taille que celle de départ mais en niveau de gris faisant ressortir les contours.

 

étape 3:
On applique un flou là où l'image des contours est blanche (et correspond à une zone de sélection de l'utilisateur).
Seulement ça ne denera pas un résultat propre, puisque les zones floutées le sont de manière homogènes.
Pour résoudre ce problème, il faut adapter le flou au niveau de gris du pixel qu'on est en train de traiter (images des contours). Si par exemple le pixel est blanc alors il faut augmenter le poids des pixel adjacents dans la matrice de convolution pour le faire disparaitre comme par exemple:
0 1/4 0
1/4 0 1/4
0 1/4 0
inversement si le pixel est noir on met tout ces voisins à 0 et il reste lui-même
s'il est gris, il faut trouver un bon compromis (en normalisant la matrice bien entendu).

 

Voilà j'espère avoir été compréhensible.


Merci beaucoup pour ta réponse très détaillée.

 

J'ai pour le moment implémenté une selection par curseur sous forme de cercle, dont l'utilisateur peut faire varier le diamètre avec un slider.
Pour la transfo de Laplace, ça marcherait je pense, une fois ça fait j'aurai mon image en niveaux de gris donc.
Comme tu le dis bien, il y aura un problème pour les gris. Le compromis pourrait être un paramètre donné par l'utilisateur, ou pas? Pourrais-tu m'expliquer, dans ton 3ème point, comment tu trouves ta matrice
 0 1/4 0
1/4 0 1/4
0 1/4 0 ?

 

Tu parles de normaliser la matrice, je suis pas sûr de bien saisir en fait  :sweat:

 

Epok, le traitement peut se faire sur une partie de l'image seulement, je choisirais sûrement un cercle, celà se fait avec des ROI (Region of Interest) sans problème normalement (j'y ai pas encore touché :D)

 

Un exemple de poussières sur une image:
http://img238.imageshack.us/img238/5920/522784441718fioriginaldw1.jpg

 

Merci en tout cas.

 

:hello:

Message cité 1 fois
Message édité par Delantera le 25-03-2007 à 15:47:34

---------------
500px Be careful when you follow the masses, sometimes the m is silent.
n°1533432
EpoK
Let's burn
Posté le 25-03-2007 à 20:41:16  profilanswer
 

Delantera a écrit :

Merci beaucoup pour ta réponse très détaillée.  
 
J'ai pour le moment implémenté une selection par curseur sous forme de cercle, dont l'utilisateur peut faire varier le diamètre avec un slider.
Pour la transfo de Laplace, ça marcherait je pense, une fois ça fait j'aurai mon image en niveaux de gris donc.
Comme tu le dis bien, il y aura un problème pour les gris. Le compromis pourrait être un paramètre donné par l'utilisateur, ou pas? Pourrais-tu m'expliquer, dans ton 3ème point, comment tu trouves ta matrice
 0 1/4 0
1/4 0 1/4
0 1/4 0 ?
 
Tu parles de normaliser la matrice, je suis pas sûr de bien saisir en fait  :sweat:  
 
Epok, le traitement peut se faire sur une partie de l'image seulement, je choisirais sûrement un cercle, celà se fait avec des ROI (Region of Interest) sans problème normalement (j'y ai pas encore touché :D)
 
Un exemple de poussières sur une image:
http://img238.imageshack.us/img238 [...] naldw1.jpg
 
Merci en tout cas.
 
:hello:


 
tu veux corriger quoi sur cette image ?

n°1533446
Delantera
Hail Seitan.
Posté le 25-03-2007 à 21:35:38  profilanswer
 

EpoK a écrit :

tu veux corriger quoi sur cette image ?


Ben les 10000 poussières qu'il y a dessus :D


---------------
500px Be careful when you follow the masses, sometimes the m is silent.
n°1543308
Delantera
Hail Seitan.
Posté le 16-04-2007 à 13:34:01  profilanswer
 

Rebonjour,

 

En fait maintenant j'aimerais dessiner un petit carré vide sur mon image, je m'explique...

 

En fait j'aimerais pouvoir dessiner la zone que je veux traiter sous la forme d'un cadre carré de la dimension choisie par l'utilisateur, et être capable de l'effacer, d'en refaire un... tout ça sur l'image.

 

Je ne sais pas trop comment faire, j'ai vu qu'il etait possible d'utiliser un objet graphics sur une BufferedImage, mais est-ce flexible? Je veux dire,  il me faudrait 2 couches en fait, une où je gère le carré de la taille choisie par l'utilisateur (la zone à traiter) et que l'utilisateur peut effacer, et refaire ailleurs, et l'autre avec l'image en-dessous, pour pouvoir voir où positionner le carré que l'utilisateur veut...

 

Quelqu'un aurait une idée de la methode préférable à utiliser?

 

Merci beaucoup...

 

:hello:


Message édité par Delantera le 16-04-2007 à 13:35:22

---------------
500px Be careful when you follow the masses, sometimes the m is silent.
n°1543540
Delantera
Hail Seitan.
Posté le 16-04-2007 à 22:51:24  profilanswer
 

Up!

 

Un JLayeredPane serait-il une bonne solution pour ça ou il y a-t-il plus simple?


Message édité par Delantera le 16-04-2007 à 22:51:47

---------------
500px Be careful when you follow the masses, sometimes the m is silent.
n°1545874
Delantera
Hail Seitan.
Posté le 20-04-2007 à 17:06:13  profilanswer
 

Pour revenir au problème du traitement de l'image, la methode de Laplace donne les contours de la tâche, mais le centre de ma tâche sera noir, donc le traitement se fera sur les contours seulement... Ou bien je loupe quelquechose? Sobel a l'air de donner toute la tâche, je sais pas trop quoi utiliser.

 

Sinon, convertir l'image en niveaux de gris, et augmenter le contraste pour faire ressortir la tâche pourrait être une solution?

 

Sinon, comment generer du flou sur des pixels seulement, et pas sur toute l'image?

 

Je sais vraiment pas par quel bout prendre le problème là, surtout que ça commence à urger pour mon projet :/

 

Toute aide est précieuse... Merci! :jap:


Message édité par Delantera le 20-04-2007 à 17:09:00

---------------
500px Be careful when you follow the masses, sometimes the m is silent.
n°1548797
Delantera
Hail Seitan.
Posté le 25-04-2007 à 19:01:03  profilanswer
 

Bon j'ai fait mon truc, j'ai utilisé Laplace :).
 
Il me manque juste le flou sur des pixels choisis et non pas sur un rectangle...
 
Help!!!!


---------------
500px Be careful when you follow the masses, sometimes the m is silent.
n°1552846
Delantera
Hail Seitan.
Posté le 03-05-2007 à 00:56:59  profilanswer
 

Hello!

 

Alors voilà j'ai fini mon programme (je dois rendre demain :d), si ça interesse quelqu'un je pourrais mettre les sources sur mon FTP...

 

Faut juste me dire si ça vous interesse au cas où :)

 

:hello:

 

(Pour l'info j'ai fait le flou manuellement à la bourrin avec la moyenne des 8 pixels environnant pour chaque pixel à traiter :d)


Message édité par Delantera le 03-05-2007 à 00:57:35

---------------
500px Be careful when you follow the masses, sometimes the m is silent.
n°1572846
nonosa
Posté le 10-06-2007 à 12:19:22  profilanswer
 

salut  
delantera
je me  demande si tu peux me donner les source de ton programme ca serai tres gentil
mon adresse et nonosa2000@hotmail.com


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Avis pour programme utilisant JAI (Java Advanced Imaging)

 

Sujets relatifs
applet java et recuperation des variables de session[Java] Problème (simple ??!) d'ArrayList
[Java - Swing] Pourquoi mon JButton ne s'affiche pas ?[java] Souligner un String dans la console
[Java - Swing] Question simple : positionner l'applet avec setBounds()horloge java pour un jeu
programme backgammon java[réglé] probleme d'execution de programme C..
java.sql.SQLException: Bad handshake 
Plus de sujets relatifs à : Avis pour programme utilisant JAI (Java Advanced Imaging)


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR