Académique Documents
Professionnel Documents
Culture Documents
M1 3IR
saidi@univ-paris13.fr
Plan
Introduction au JRI
Choix du langage java
Premier pas sous java
Conclusion
Introduction
Java pour réseaux et image
Objectifs et contenu
Bases de l’algorithmique
Structures de données
o Modélisation des réseaux
o Manipulation/traitement de l’image
Initiation à la programmation réseau
Calculs dans les réseaux
o Plus courts chemins
o Arbres couvrants
Communication réseau (partie supprimée pour manque de temps)
o Sockets
o RMI (Remote Method Invocation)
Image
.java Compiler
.class .class
Interpreter Interpreter
Hello
Hello World
World
Linux
Windows
M1 3IR
saidi@univ-paris13.fr
Plan
Introduction aux structures de données avancées
Files, piles et listes
Tables de hashage
Hashage double
Chaînage linéaire
Arbres
Arbres multibranches
Arbres linéaires
Arbres linéaires de recherche
Arbres rouge-noir et arbres AVL
Files de priorité (Heaps ou priority queues)
Conclusion
Structures de données
Stockent efficacement les données dans des
containers
Collections d’objets
Améliorent les performances
Temps d’accès (lecture et modification) et espaces mémoires réduits
En standard, java spécifie le comportement de diverses
structures de données
Plusieurs interfaces (List, Set, Map, Deque, Queue)
Framework Collections
Import java.util.*
Plusieurs implémentations sont fournies
ArrayList, HashSet, HashMap, TreeSet, TreeMap, LinkedList
Dans ce cours
Structures à étudier
Listes
Parcours séquentiels des élements de la liste
Tables de hashage
Accès direct et rapide (quasi-constant) aux éléments de la table
Arbres
Eléments ordonnés
Accès relativement rapide (logarithmique par rapport au nombre
d ’éléments) aux éléments
File
FIFO (First In First Out)
Exemple : file d’attente aux caisses d’un supermarché
public DataStructureException () {
super () ;
}
public DataStructureException (String msg) {
super (msg) ;
}
Illustration
File implémentée sous forme de tableau
tab
head = 2 0
1
2
3
capacity = tab.length
4
tail = 7 5
6
7
Code
File implémentée sous forme de tableau
public class FixedList implements Iterable, Liste {
// champs
private Object[] tab;
private int head, tail, count;
// Constructeur
public FixedList(int capacity) {
if (capacity < 1)
throw new DataStructureException("Parameter error");
this.tab = new Object[capacity];
this.head = this.tail = this.count = 0;
}
public boolean push(Object element) throws DataStructureException {
if (count == tab.length)
throw new DataStructureException("Liste pleine");
if (element == null) return false;
tab[tail++] = element; ++count;
if (tail == tab.length) tail = 0;
return true;
}
Code (suite 1)
File implémentée sous forme de tableau
public boolean add(Object element) throws DataStructureException {
return this.push(element);
}
Code (suite)
File : itérations et toString
protected class InternalIterator implements Iterator {
int elementIndex = 0;
public boolean isValid() { return elementIndex < count; }
public Object next() throws DataStructureException {
if (elementIndex >= count) throw
new DataStructureException("Iterateur invalide");
int index = head + elementIndex++ ;
if (index >= tab.length) index -= tab.length ;
return tab[index];
}
}
public Iterator iterator() { return new InternalIterator() ; }
Pile
LIFO (Last In First Out)
Insertion en tête de la pile
Suppression en tête de la pile
Implémentation très semblable à celle de la file
empilement 4 4 dépilement
4
3 3
2 2
1 1
Illustration
Pile implémentée sous forme de tableau
A faire (exercice)
Un tableau de capacité = capacity
Un index pointant le dernier élément inséré
Plus simple à implémenter qu’une liste
Illustration
Pile implémentée sous forme chainée
Suite de maillons constitués chacun
D’un élément (l’objet)
D’une référence vers le prochain maillon
Maillon 1 Maillon 2 Maillon 3
(Iterator) (Iterator) (Iterator)
Pile
Empilement
Dépilement
Interfaces pour les itérations dans une pile
// Fichier Iterator.java
package jri;
public interface Iterator {
public boolean isValid () ;
public Object next () ;
}
// Fichier StackIterator.java
package jri;
public interface StackIterator extends Iterator {}
// Fichier Iterable.java
package jri;
public interface Iterable {
public Iterator iterator () ;
}
Code
Pile chainée
package jri;
public class UnlimitedStack implements Iterable, Liste {
Code (suite 2)
Pile chainée
protected Maillon maillon ;
protected int count ;
public boolean push (Object element) {
if (element == null) return false;
this.maillon = new Maillon (element, this.maillon) ;
++count ;
return true ;
}
// retourner le premier objet (tete) sans l'effacer
public Object peek() {
if (count == 0) return null ;
return this.maillon.element ;
}
// retourner le 1er objet (tete) après l'avoir effacé de la liste
public Object pop() {
if (count == 0) throw new DataStructureException ("Pile vide") ;
Object result = this.maillon.element ;
--count ;
this.maillon = this.maillon.next ;
Code (suite et fin)
Pile chainée
return result ;
}
Test de la pile
import jri.StackIterator;
import jri.UnlimitedStack;
pile.clear() ;
System.out.println() ;
Test de la pile (suite et fin)
for (int i = 0 ; i<5 ; ++i) pile.push(i) ;
System.out.print("Pile [ ") ;
for (StackIterator it = pile.iterator() ; it. isValid () ; ) {
System.out.print(it.next()+ " ") ;
}
System.out.println(" ]");
}
}
Hashcode = 4 ...
Hashcode = 3 ...
Hashcode = 2 ...
Hashcode = 1 ...
Hashcode = 0 ...
Table de hashage : principes
Une fonction de hashage h est appliquée à la clé k pour
déterminer un hash code = h (k)
Le hash code détermine l’indice e de la valeur v
associée à la clé k
Hashcode = 3
association
Hashcode = 2 Clé j valeur associée à la clé j
Hashcode = 1
Hashcode = 0 Clé i valeur associée à la clé j
Hashcode = 3 null
Hashcode = 2 null
Hashcode = 1 (1, 1)
Hashcode = 0 (5, 5)
Table de hashage : précautions d’utilisation
Fonction de hashage
Toujours multiplier par un nombre premier
Pour pouvoir exploiter toutes les cases de la table de hashage
Choisir une fonction de hashage qui permet une
distribution uniforme des clés dans la table
Facteur de charge λ
λ = nombre de clés insérées / taille de la table de hashage
Table de hashage implémentée avec le double hashage
Si λ > 0.5 doubler la taille de la table
Table de hashage implémentée avec le chaînage linéaire
Si λ > 0.7 doubler la taille de la table
Implémentation
Interface HashTable
package jri;
public interface HashTable {
}
Interface pour les hashages primaire
et secondaire
// Fichier CollisionManager.java
package jri;
table.put(2, 2) ;
Arbres
Structure de données permettant de représenter
des informations hiérarchisées
Exemples
Arbre généalogique, expression régulière, etc.
Un arbre est constitué d’un ensemble de noeuds liés
entre eux par des arêtes
Tout noeud (à l’exception de la racine) B racine
a un seul père et peut avoir
0, 1 ou plusieurs fils
A C D
Un noeud ne possédant pas
de fils est appelé noeud feuille
feuilles E F G
Types d’arbres
B
Deux catégories
Arbres binaires
A D
Deux fils au maximum : gauche et droite
Arbres multibranches C E F
Pas de contraintes sur
le nombres de fils Arbre binaire
Peuvent être représentés
par des arbres binaires B
Deux fonctionalités
Stockage hiérarchisé A C D
XML, expressions régulières, etc.
Recherche rapide E F
Dictionnaire, plus courtes distances, etc. Arbre multibranches
// Methodes héritées
// public boolean isValid () ; // public void next () ;
}
Arbres binaires
Avant d’aller plus loin
Voir comment parcourir un arbre binaire de
recherche
Itérateur
Le plus petit élément
Le successeur
Le prédécesseur
Voir comment sont construits et modifiés les arbres
binaires de recherche
Les insertions
Les suppressions
Parcours de l’arbre
du plus petit au plus grand
Iterator.next ()
13 22
Iterator.first () 2 16 25
5 14 17
15 Iterator.end ()
Construction d’arbres binaires : gestion des
insertions
Initialement : aucun noeud 20 Insertion de 20
20 devient root car
Insertion de 18 18 21 aucun root
Insertion deavant
21
Insertion de 13 13 22 Insertion de 22
2
Insertion de 16 2 16 25 Insertion de 25
5
17
Insertion de 14 5 14 17
15
Insertion de 15
18 21 18 21
13 22 13 22
2 16 25 2 16 25
5 17 5 17
Construction d’arbres binaires : gestion des
suppressions (cas 2)
Suppression d’un noeud ayant deux fils (ex. Noeud 13)
Déterminer le successeur de 13 (le noeud le plus à gauche des
descendants de son fils de droite. Evidemment, ce noeud ne peut pas
avoir de fils gauche) successeur = 14
20 20
18 21 18 21
13 22 13 22
2 16 25 2 16 25
5 14 17 14 5 14 17
15 successeur (13) 15
while (x != SENTINEL){
parent = x ;
compareResult = compare.compare(element, x.element) ;
//empecher doublons = décommentez les 2 lignes svt
//if (compareResult == 0) return null ;
//else
if (compareResult <= 0) x = x.left ;
else x = x.right ;
}
++count ;
--count ;
Node succChild, succ ;
if (deletedNode.left == SENTINEL
|| deletedNode.right == SENTINEL)
succ = deletedNode ;
else succ = successor (deletedNode) ;
Object integer2Print=null ;
BinaryTreeIterator it = binaryTree.iterator () ;
it.first() ;
System.out.print("Arbre a "+binaryTree.size()
+" éléments [ ") ;
while (it.isValid ()) {
integer2Print = it.next () ;
System.out.print(integer2Print+ " ") ;
}
System.out.println("]") ;
System.out.println("\n\n"+binaryTree+"\n") ;
binaryTree.remove(17) ;
binaryTree.remove(15) ;
Exemple d’utilisation d’un arbre binaire
de recherche (suite et fin)
it.first() ;
System.out.print("Arbre à "+binaryTree.size()
+" éléments [ ") ;
while (it.isValid ()) {
integer2Print = it.next () ;
System.out.print(integer2Print+ " ") ;
}
System.out.println("]") ;
System.out.println("\n\n"+binaryTree+"\n") ;
13 2 13 17
16
17
20 20
18 21 21
14
14 25 22 22
5 18
5 16
13 16 25
13
18 26
13 20 25 28
2 16 19 22
5 14 17
0 0 -1 -1
13 18 22 25
+1 0 0 0
2 15 21 24
0 0 0
5 14 16
+1 0
13 23
+1 -1 -1 -1
2 17 22 25
0 0 0 0 0
5 15 18 21 24
0 0
14 16
13 23
2 17 22 25
5 15 18 21 24
16
La file de priorité
Priority Queue ou Heap
Arbre binaire vérifiant
La racine est toujours le plus petit élément (haute priorité)
Evidemment, on pourra choisir une autre implémentation dans
laquelle la racine correspond toujours au plus grand élément
Chaque niveau de l’arbre doit être complètement rempli
avec les éléments avant de passer au niveau suivant
La suppression concerne toujours le noeud racine
Une file de priorité assure qu’un événement de priorité
supérieure est traité avant un autre de priorité inférieure
Peut être implémentée avec un arbre binaire ou un tableau
2 2 2 2 2
15 15 5 15 5 15 5
17 17 16
2 2
15 5 15 5
17 16 18 17 16 18 14
0 1 2 3 4 5 6 7
2 15 5 17 16 18 14
File de priorité : quelques règles
Tout noeud dans l’arbre est inférieur à ses deux fils
La racine de l’arbre correspond donc au minimum
Si la file de priorité est implémentée avec une table
Le noeud fils gauche d’un noeud d’indice i se trouve à la
position 2*i
Le noeud fils de droite d’un noeud d’indice i se trouve à la
position 2*i+1
Le noeud père du noeud d’indice i se trouve à la position
partie_entière (i / 2)
15 5 15 5 15 5
17 16 18 14 17 16 18 14 1 16 18 14
1 17
2 1
1 5 2 5
15 16 18 14 15 16 18 14
17 17
Algorithme d’insertion d’un élément
La position du premier noeud feuille libre est connue
1. Ajouter le noeud sur la première position libre
2. Incrémenter de 1 le nombre de noeuds de l’arbre count
3. Aller à l’étape 7 si le noeud ajouté correspond à la racine
4. Comparer le noeud ajouté à son noeud père
5. Si le noeud ajouté est inférieur au noeud père
Echanger les positions des deux noeuds
6. Aller à l’étape 3
7. Fin
5 2 5 2
15 16 18 14 15 16 18 14
17
2 2
5 17 5 14
15 16 18 14 15 16 18 17
Algorithme de suppression du noeud racine
La position de la racine est connue et est stockée dans
un champ
1. Si le nombre de noeuds de l’arbre count est égal à zéro
Aller à l’étape 6 (déclencher une exception)
2. Sinon décrémenter count de 1
3. Remplacer le noeud racine par le dernier noeud n de
l’arbre (le noeud feuille le plus à droite)
4. Comparer le noeud n avec son plus petit noeud fils p
5. Si le noeud n est supérieur à ce noeud fils p alors
Echanger les positions des deux noeuds n et p
Aller à l’étape 4
6. Fin
File de priorité
A titre d’exercice, implémenter les files de priorité en
utilisant un tableau
Conclusion
Les structures de données sont efficaces pour stocker et
organiser des données
Accès (lecture et modification) rapide aux données
Tri des données
Souvent, il est possible d’implémenter les structures de
données en utilisant
Des tableaux ou des références
Il est possible de parcourir tous les éléments de toute
structure de données
Attention : certains parcours (itérateurs) sont coûteux et ne
garantissent pas le même ordre de parcours
Pour de meilleures performances, il pourrait être
judicieux de combiner différents types de structures
M1 3IR
saidi@univ-paris13.fr
Plan
Introduction aux Routage
Plus courts chemins
Algorithme de Bellman-Ford
Algorithme de Dijkstra
Arbre couvrant minimal
Algorithme de Kruskal
Introduction au routage
Permet l’acheminement des objets d’un point à
l’autre
Collecte des données sur le réseau (routier, informatique,
télécom, etc.)
Calcul de routes
Dans ce chapitre, nous nous intéresserons au module
de calcul de routes (path computation)
Route d’une source
Vers une seule destination
Algorithme des plus courts chemins
Vers plusieurs destinations
Arbre couvrant minimal
Domaines d’application du routage
Réseaux informatiques
Routage unicast
OSPF, IS-IS (shortest Path First, algorithme de Dijkstra)
RIP (Distance Vectors, Algorithme de Bellman-Ford)
Routage multicast
MOSPF, PIM, DVMRP
Diffusion
STP
Réseaux routiers
Réseaux télécoms
Algorithmes de Bellman-Ford
Exemple
s
1
1 1
2 3
4 1 3
4 5 t
1
1 2 3 4 5
Étape 0 ∞ ∞ ∞ ∞ 0null
Étape 1 ∞ ∞ 35 15 0null
Étape 2 43 54 24 15 0null
Étape 3 33 54 24 15 0null
Étape 4 33 41 24 15 0null
Complexité de l’algorithme de Bellman-Ford
Etape 0
n opérations
Etape i (0 < i <= n-1)
m opérations
Nombre d’opérations total
n + (n-1).m
Complexité O (nm)
Algorithme de Dijkstra
distance ∞
Marque
noeud 1 ∞
s
noeud 2 ∞
1
noeud 3 ∞ 1 1
noeud 4 ∞ 2 3
noeud 5 0null 4 1 3
4 5 t
1
(5, 0)
Algorithme de Dijkstra
distance ∞ ∞
Marque
noeud 1 ∞ ∞
s
noeud 2 ∞ ∞
1
noeud 3 ∞ 35 1 1
noeud 4 ∞ 15 2 3
noeud 5 0null 0null 4 1 3
4 5 t
1
(4, 1) (3, 3)
Algorithme de Dijkstra
distance ∞ ∞ ∞
Marque
noeud 1 ∞ ∞ ∞
s
noeud 2 ∞ ∞ 54
1
noeud 3 ∞ 35 24 1 1
noeud 4 ∞ 15 15 2 3
noeud 5 0null 0null 0null 4 1 3
4 5 t
1
(3, 2) (2, 5)
Algorithme de Dijkstra
distance ∞ ∞ ∞ ∞
Marque
noeud 1 ∞ ∞ ∞ 33
s
noeud 2 ∞ ∞ 54 54
1
noeud 3 ∞ 35 24 24 1 1
noeud 4 ∞ 15 15 15 2 3
noeud 5 0null 0null 0null 0null 4 1 3
4 5 t
1
(1, 3) (2, 5)
Algorithme de Dijkstra
distance ∞ ∞ ∞ ∞ ∞
Marque
noeud 1 ∞ ∞ ∞ 33 33
s
noeud 2 ∞ ∞ 54 54 41
1
noeud 3 ∞ 35 24 24 24 1 1
noeud 4 ∞ 15 15 15 15 2 3
noeud 5 0null 0null 0null 0null 0null 4 1 3
4 5 t
1
(2, 4)
Algorithme de Dijkstra
distance ∞ ∞ ∞ ∞ ∞ ∞
Marque
noeud 1 ∞ ∞ ∞ 33 33 33
s
noeud 2 ∞ ∞ 54 54 41 41
1
noeud 3 ∞ 35 24 24 24 24 1 1
noeud 4 ∞ 15 15 15 15 15 2 3
noeud 5 0null 0null 0null 0null 0null 0null 4 1 3
4 5 t
1
Algorithme de Prim
T←∅
A ← {a0}
a0 peut être n’importe quel noeud du graphe
Tant que |T| < n − 1 faire
Calculer l’arête e = (a, b) (avec a ∈ A et b ∉ A) de coût
minimal
T ← T ∪ {e}
A ← A ∪ {b}
Fin-Tantque
Retourner T
Exécution de l’algorithme de Prim
1
1 1
2 1 3
4 3
4 5
1
3 2 2
1
6
7 8
2 2
Algorithme de Kruskal
Soit L une liste triée des arêtes du graphe G
La liste est triée suivant les poids des arêtes, du plus faible
au plus grand
T←∅
Tant que |T| < n − 1 et L ≠ ∅ faire
e = (a, b) ← retrait_premier_élément (L)
Si composanteConnexe(a) ≠ composanteConnexe(b) alors
T ← T ∪ {e}
Finsi
Fin-Tantque
Retourner T
Exécution de l’algorithme de Kruskal
1 1 1
1 1 1 1 1 1
2 1 3 2 1 3 2 1 3
4 3 4 3 4 3
4 5 4 5 4 5
1 1 1
3 2 2 3 2 2 3 2 2
1 1 1
6 6 6
7 8 7 8 7 8
2 2 2 2 2 2
Conclusion
Arbre des plus courts chemins
Graphe orienté ou non orienté
Poids positifs ou nuls
Dijkstra (et/ou Bellman-Ford)
Poids négatifs sans cycles de coût négatif
Belmann-Ford
Arbre couvrant minimal
Graphe non orienté
Algorithme de Prim
Algorithme de Kruskal
Java pour réseaux et image (JRI)
Cours 3 : Traitement d’image
sous java (API java2D)
M1 3IR
saidi@univ-paris13.fr
Introduction
La quasi-totalité des logiciels commercialisés
utilisent des images
icones (boutons, barre de titre, etc.), logos, aides, etc.
Deux types d’images
Image vectorielle
Composée d’objets géométriques (courbes définies par des formules
mathématiques comme des segments de droite, cercles, etc.)
Diverses extensions (.SVG, .DXF, .DWG, .SWF, .EPS)
Le zoom ne dégrade pas la qualité de l’image
Image matricielle (bitmap)
Matrice de points appelés pixels (PICture Element)
Diverses extensions (.bmp, .jpg, .gif, .png, etc.)
Le zoom dégrade la qualité de l’image
Plan
Brève introduction à GUI
Fenêtres et gestion dévénements
Classe BufferedImage (java.awt.image.BufferedImage)
Classe ColorModel (java.awt.image.ColorModel)
Classe Raster (java.awt.image.Raster)
API java2D
Images numériques sous forme matricielle (bitmap)
Codées en RGB (Red, Green, Blue), en binaire ou en grisé
création et enregistrement
modification
Filtres : transformation affine (zoomer), convolution (flouter,
déterminer les contours, etc.),
Accès et modification de pixels, etc.
actionPerformed ()
ActionListenerImplementation
Bouton
JMenuBar
JMenu
MenuItem
Image
extends
VolatileImage BufferedImage
La classe BufferedImage
Contient
Un ColorModel
Manière d’interpréter les couleurs
TYPE_INT_ARGB (alpha, rouge, vert, bleu)
TYPE_INT_RGB (rouge, vert, bleu)
TYPE_BYTE_GRAY (niveau de gris, codage sur un seul octet)
Un WritableRaster : un Raster autorisé en écriture
Un Raster est composé de
DataBuffer
o Données brutes dans un tableau
SampleModel
o Interprétation des données brutes
Lecture/écriture des fichiers image
Paquetage javax.imageio
ImageIO
Description du contenu de fichiers image, y compris des
métadonnées (date, heure, lieu, sensibilité ISO, usage du flash,
vitesse d’obturation, etc.)
ImageReader, ImageReadParam et ImageTypeSpecifier
Contrôle du processus de lecture d'image
ImageWriter et ImageWriteParam
Contrôle du processus d'écriture des images
ImageTranscoder
Transcodage entre formats
IIOException
Signaler les erreurs
public static
void afficheFormatsSupportesEnLecture () {
String names[]
= ImageIO.getReaderFormatNames();
for (int i = 0; i < names.length; ++i)
System.out.println(" fomat supporté "
+ "en lecture :" + names[i]);
}
}
public static
void afficheFormatsSupportesEnEcriture () {
String names[]
= ImageIO.getWriterFormatNames();
for (int i = 0; i < names.length; ++i)
System.out.println(" fomat supporté "
+ "en écriture:" + names[i]);
}
}
Affichage d’une image BufferedImage
Affichage dans un panneau
Possibilité d’affichage dans une autre image
Redéfinition de la méthode paintComponent de la classe
JPanel
Dessiner l’image : méthode drawImage (im, x, y, obs) ;
im : objet Image (BufferedImage)
x, y : coordonnées du coin supérieur gauche de l’image à dessiner
Obs : observateur pour un chargement asynchrone (ici null)
public class PanDessin extends JPanel {
BufferedImage monImage = null;
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if(monImage != null) g.drawImage(monImage, 0, 0, null) ;
//Pour ajuster l’image à la taille du panneau, utilisez :
//g.drawImage(monImage, 0, 0, getWidth(), getHeight(), null);
} // ...
}
Création d’image
Peut-être contenue dans un panneau
Peut contenir d’autres formes graphiques (cercles,
rectangles, etc.)
protected BufferedImage createImage(){
int ImWidth = 600, imHeight = 400 ;
BufferedImage image = new BufferedImage (ImWidth, imHeight,
BufferedImage.TYPE_INT_RGB);
// on récupère le contexte graphique de la BufferedImage
Graphics2D g = image.createGraphics();
// la couleur de dessin est le bleu
g.setColor (Color.blue);
// on dessine un cercle rempli de rayon 100 dont le centre est
// (ImWidth/2 + rayon, imHeight/2 + rayon)
int rayon = 100 ;
g.fillOval (ImWidth/2-rayon, imHeight/2-rayon, 2*rayon, 2*rayon) ;
// on libère les ressources utilisées pour le contexte graphique
g.dispose();
return image;
}
Opérations sur les images
Interface BufferedImageOp implémentée par :
AffineTransformOp
Transformation affine (x’ = a * x + b * y + c, y’ = a’ * x + b’ * y + c’)
ColorConvertOp
Modification des couleurs des pixels
Tableau d’objects ColorSpace ou ICC_Profile
ConvolveOp
Convolution mathématique (multiplication par une matrice kernel)
LookupOp
RescaleOp
Modification des couleurs des pixels de l’image bufferisée
couleur’ = couleur * facteur + deplacement
Image processing
operation
filter
source image destination image
BufferedImageOp
Changement de la taille de l’image
(methode 1)
Effectuer une transformation affine
Image source vers une image de destination
Changement d’échelle
AffineTransform trans = AffineTransform.getScaleInstance(x, y) ;
x et y correspondent aux coefficients de multiplication
Interpolation des pixels
int interpolation = AffineTransformOp.TYPE_BICUBIC ;
Interpolation bicubique
Autres interpolations
TYPE_BILINEAR, TYPE_NEAREST_NEIGHBOR
Application de l’opération de transformation affine
AffineTransformOp operationRetailler
= new AffineTransformOp (trans, interpolation) ;
operationRetailler.filter(monImage, imageRetaillee) ;
K=
Khorizontal = Kvertical =
Appliquer la convolution
Choisir un masque et appliquer une opération de
convolution
protected void imageConvolue(float [] masqueConvolution, int nbLines) {
//on va utiliser le masque flou
BufferedImage imageFlou = new BufferedImage(monImage.getWidth(),
monImage.getHeight(), monImage.getType());
this.paintAll(g);
g.dispose();
return image;
}
Conclusion
API java2D
Chargement et enregistrement des images
Affichage des images
Modification des images
Appliquer une convolution (filtres)
Agrandissement, réduction, détection de contours, floutage, etc.
Modification brute des pixels
D’autres API sont disponibles sous java pour traiter les
images
Java Advanced Image (JAI)
Etend l’API java2D
Compatible avec l’API java2D
java3D