JAVA2D appliquer un filtre de convolution à une image

JAVA2D appliquer un filtre de convolution à une image - Java - Programmation

Marsh Posté le 31-03-2020 à 19:23:03    

Bonjour / Bonsoir !  
 
Toujours entrain d'étudier différentes manière de programmer avec mon uni, je me retrouve avec le langage le moins utilisé que je connaisse : JAVA 2D.
C'est simple, tous les tutoriels que je trouve datent de 2008 minimum... Et son souvent très peu complet.
Je vais pas mentir, j'ai un devoir noté sur ça.
J'ai réussi à découvrir l'importance des Panels / Images / Modification de tailles, Visible ou non ,titre ... et d'autre choses.
 
Cependant, il y'a une chose que je GA-LERE, je ne trouve rien sur internet, en anglais ou en français. Enfaite, le peu que je trouve se résume à des bouts de codes qui ne marchent pas quand je les tests.
C'est appliquer un filtre par convolution sur une image !
 
J'ai compris le principe de convolution, le noyau ( kernel ) d'une matrice 3x3 etc...
Hors, je ne comprend rien, je suis perdu, 0 conseils, 0 astuces, et puis avec le confinement, jvous explique pas la galère.
 
J'aimerai savoir, comment appliquer un filtre noir et blanc, ou bien flou avec convolution.  
Ce forum est ma dernière chance  :pt1cable:  
Merci d'avance :D .

Reply

Marsh Posté le 31-03-2020 à 19:23:03   

Reply

Marsh Posté le 01-04-2020 à 18:28:29    

xameal a écrit :

Bonjour / Bonsoir !  
 
Merci d'avance :D .


 
Bon c'est vrai, Java2D c'est un peu "old fashion", mais bon c'est quand même assez simple.
Avec ton fichier image, tu peux créer un objet de type BufferedImage... là a juste besoin de 4 méthodes:
 
1) getWidth()
2) getHeight()
3) getRGB(x,y)  (pour lire les composantes RGB d'un pixel de coordonnées x et y)
4) setRGB(x,y)  (pour écrire les 3 composantes RGB dans un pixel au coordonnées x et y)
 
 
Ensuite tu appliques la procédure qui doit se trouver dans ton cours "à la mano"... C'est tout sauf efficace mais c'est pas compliqué. Autre solution de fainéant: tu délègues à OpenCV   ;)  mais pas sûr que ton prof apprécie.

Reply

Marsh Posté le 01-04-2020 à 19:19:57    

Salut,  
 
enfaite, la ou l'exercice est compliquer, c'est que justement, on à pas de cours sur ça :).  
On a appris en théorie la convolution ainsi que les noyaux, mais pas en format "code".
 
Ducoup, pour le moment, j'arrive seulement à afficher une image ( BufferedImage ) dans une fenetre.
Savoir comment appliquer un filtre avec une manière de Convolution et j'afficherai cette deuxième image dans une autre fenêtre.
 
OpenCV ? C'est-à-dire ? Honnêtement que mon prof apprécie ou pas, c'est pas vraiment mon problème, tant que j'arrive à faire ce qu'il demande, et en ayant compris, c'est ce qui m'importe.
 

Reply

Marsh Posté le 02-04-2020 à 19:15:34    

Vas voir du côté de la librairie Twelvemonkeys et la classe ConvolveWithEdgeOp, c'est peut être le genre de chose que tu cherches.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-04-2020 à 08:20:14    

xameal a écrit :

Salut,  
 
enfaite, la ou l'exercice est compliquer, c'est que justement, on à pas de cours sur ça :).  
On a appris en théorie la convolution ainsi que les noyaux, mais pas en format "code".


 
Ben si tu es en train de faire une formation d'informatique (je ne vois pas trop sinon dans quel cours on pourrait enseigner la segmentation) c'est justement ce que tu dois fournir comme travail: traduire un algorithme en code. Si tu fais une formation de secrétariat alors effectivement il pourrait vous donner le code et vous demander de le recopier, en mettant de jolies couleurs et si possible quelques petits smiley dans les commentaires du programme.  
 
Non sérieusement:  la matrice de convolution est une matrice 3x3, donc tu dois prendre 9 pixels (aussi 3x3) sur ton image (utiliser getRGB()). Là ça n'a rien à voir avec java2d, c'est juste deux petites boucles avec les limites qui vont bien. Ensuite tu fais les multiplications cellules à cellules comme tu l'as vu au cours et tu obtiens une valeur (en fait normalement 3, une par composante si tu as une image de départ en couleur) et tu stockes cette valeur dans un tableau... (tu peux calculer la taille du tableau de résultat avec la taille de l'image de départ). Quand tu as fini tous les calculs tu crées un autre "BufferedImage" que tu remplis avec les valeurs que tu as calculées. (commentaire pour les pros : oui je sais c'est con mais c'est souvent plus simple à comprendre)... et tu peux ensuite afficher ton image transformée ou la stocker sur disque...
 
 

xameal a écrit :


Ducoup, pour le moment, j'arrive seulement à afficher une image ( BufferedImage ) dans une fenetre.
Savoir comment appliquer un filtre avec une manière de Convolution et j'afficherai cette deuxième image dans une autre fenêtre.
 
OpenCV ? C'est-à-dire ? Honnêtement que mon prof apprécie ou pas, c'est pas vraiment mon problème, tant que j'arrive à faire ce qu'il demande, et en ayant compris, c'est ce qui m'importe.
 


 
OpenCV, voyons voir.... j'ai tapé dans google "java opencv tutorial" et là y'a plein de liens qui expliquent comment faire. Cependant si tu as de la peine avec la version ci-dessus, tu risques ramer sévère. L'utilisation de OpenCV est nettement moins facile que de générer 2 BufferedImage ..  
 
 

Reply

Marsh Posté le 20-04-2020 à 18:49:12    

Merci, j'ai réussi depuis un petit peu l'exercice grâce aux conseils mais j'ai complètement oublier de le dire ici ^^.
Ton commentaire résume à peu près ce que j'avais fait, par contre "traduire un algorithme en code", jvais pas te mentir que c'est facile à dire mais assez compliqué quand y'a très peu de tutoriel sur Internet, c'est pas comme du Java / C / C++ etc...  
 
En tous cas merci, vos conseils ont été grave utile !
Bonne journée à tous, et bonne santé dans ce confinement.

Reply

Sujets relatifs:

Leave a Replay

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