import java.awt.Color; import java.awt.FileDialog; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import java.awt.image.ByteLookupTable; import java.awt.image.ConvolveOp; import java.awt.image.Kernel; import java.awt.image.LookupOp; import java.awt.image.PixelGrabber; import java.io.File; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JSplitPane; import javax.swing.KeyStroke; public class TP_1 { JFrame frame; public int larg, haut; //variable pour charger le Raster int [] pixelsCourant; //tableau pour charger le masque 5x5 static float [] elements25= new float[25]; // des variables pour le calcul des histogrammes int[] tab= new int[256]; int[][] tabC= new int[256][3]; int[] tgris= new int[256]; int[][] tcouleur= new int[256][3]; //** creation des menu JMenuBar menubar =new JMenuBar(); JMenu Fichier=new JMenu("Fichier"); JMenuItem ouvrir = new JMenuItem("Ouvrir"); JMenuItem Enregistrer = new JMenuItem("Enregistrer"); JMenuItem Quitter = new JMenuItem("Quitter"); JMenu Traitemant =new JMenu("Traitemant"); JMenuItem canalR = new JMenuItem("canal rouge"); JMenuItem NivGris = new JMenuItem("NivGris"); JMenuItem Bin = new JMenuItem("Binarisation"); JMenuItem negatif = new JMenuItem("negatif"); JMenuItem floue = new JMenuItem("floue"); JMenuItem mediane = new JMenuItem("mediane"); JMenuItem laplacien = new JMenuItem("Laplacien"); JMenu histogramme = new JMenu("histogramme"); JMenuItem histo= new JMenuItem("dessiner histogramme couleur"); JMenuItem histoGris= new JMenuItem("dessiner histogramme gris"); JMenu aide = new JMenu("aide"); JMenuItem Aide= new JMenuItem("aide"); //** deux panels speciales pour l'affichages des deux images originale et traitée JPane1 panel1 =new JPane1(); JPane2 panel2 =new JPane2(); //** le séparateur entre les deux images JSplitPane jSplitPane1 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,panel1,panel2); //** les menu dialogues ouverture, fermeture, enregistrement... FileDialog dialog; //** les deux images sur lesquels on travail public BufferedImage buffeurActuel, image; public TP_1() { //crée les composant de la fenetre principale frame = new JFrame(); frame.setTitle(" 1er TP traitemant d'image Master STIC "); frame.setSize(frame.getMaximumSize()); frame.getContentPane().setLayout(new GridLayout()); frame.getContentPane().add(jSplitPane1); frame.setResizable(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jSplitPane1.setResizeWeight(0.5); jSplitPane1.setOneTouchExpandable(true); frame.setJMenuBar(menubar); menubar.add(Fichier); Fichier.add(ouvrir); ouvrir.setMnemonic(KeyEvent.VK_O); ouvrir.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK)); ouvrir.setToolTipText("Ouvrir une image"); Fichier.add(Enregistrer); Enregistrer.setMnemonic(KeyEvent.VK_S); Enregistrer.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK)); Enregistrer.setEnabled(false); Fichier.addSeparator(); Fichier.add(Quitter); Quitter.setMnemonic(KeyEvent.VK_Q); Quitter.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.CTRL_MASK)); menubar.add(Traitemant); Traitemant.add(canalR); Traitemant.addSeparator(); Traitemant.add(NivGris); Traitemant.addSeparator(); Traitemant.add(Bin); Traitemant.addSeparator(); Traitemant.add(negatif); Traitemant.addSeparator(); Traitemant.add(laplacien); Traitemant.addSeparator(); Traitemant.add(floue); Traitemant.addSeparator(); Traitemant.add(mediane); menubar.add(histogramme); histogramme.add(histo); histogramme.add(histoGris); menubar.add(aide); aide.add(Aide); // si on veut changer le langage d'affichage ouvrir.setText(" ÇÝÜÜÜÜÜÜÜÜÊÍ"); Enregistrer.setText(" ÓÜÜÜÜÜÌá "); Quitter.setText(" ÃÎÜÜÜÑÌ "); ouvrir.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //......(1) long tempsDebut = System.currentTimeMillis(); //cette fonction nous permet de charger une image et de la charger puis l'afficher sur le premier Panel Ouvrir(); //......(2) long tempsFin = System.currentTimeMillis(); float seconds = (tempsFin - tempsDebut) / 1000F; System.out.println("Opération effectuée en: "+ Float.toString(seconds) + " secondes."); // (1) et (2) permettent de calculer le temps de traitement } }); Quitter.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { System.exit( 0); } }); Enregistrer.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { sauvgarder(); } }); NivGris.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { //***************** choisir de faire la conversion en niveau de gris //***************** soit en 2d (c-a-d bufferedImage) ou 1D (Raster ou vecteur) gris2D(); //gris_Raster(); //** } }); canalR.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //*************** faire un choix entre les trois méthodes de bases /////////////////////// //canalR(); canalR_Rasrer(); //garderR(); } }); Bin.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { binarisation(); } }); negatif.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { negatif(); } }); floue.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //choisir une entre les deux..masque 3x3 //moyenneur(); //ou //floue(); //ou moyenneur de 5x5 floue5(); } }); mediane.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { Mediane(); } }); laplacien.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { laplacien(); } }); histo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { tcouleur=HistogrammeC(buffeurActuel); dessinerhistoC(tcouleur); panel2.repaint(); } }); histoGris.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { tgris=Histogramme(buffeurActuel); dessinerhisto(tgris); panel2.repaint(); } }); } //*************************** public void Ouvrir(){ dialog = new FileDialog(dialog); dialog.setMode(FileDialog.LOAD); dialog.setVisible(true); try{ if(!dialog.getFile().equals("")){ File input=new File(dialog.getDirectory()+dialog.getFile()); buffeurActuel=ImageIO.read(input); //** juste pour charger une tableau une dimmension a partir de l'image pour utilisation ulterieure larg=buffeurActuel.getWidth(); haut=buffeurActuel.getHeight(); panel1.repaint() ; } } catch (Exception e){ System.out.println(e.getMessage()); } Enregistrer.setEnabled(true); } public class JPane1 extends JPanel{ public void paint(Graphics g) { if (buffeurActuel !=null){ g.drawImage(buffeurActuel,0,0,this); } } } public class JPane2 extends JPanel{ public void paint(Graphics g) { g.drawImage(image,0,0,this); } } private void sauvgarder(){ dialog.setMode(FileDialog.SAVE); dialog.setVisible(true); try { if(!dialog.getFile().equals("")){ String outfile=dialog.getFile(); File outputFile=new File(dialog.getDirectory()+outfile); ImageIO.write(image,outfile.substring(outfile.length()-3, outfile.length()),outputFile); } } catch(Exception e){ System.out.println(e.getMessage()); } } // ces trois fonctions permettent de décomposé les trois canal rouge Vert et Bleu public int getBlue(int RGB) { return RGB&0xFF; } public int getGreen(int RGB) { return (RGB>>8)&0xFF; } public int getRed(int RGB) { return (RGB>>16)&0xFF; } //// c'est pour regrouper les trois canal rouge Vert et Bleu public int makeRGB(int red, int green, int blue){ //** l'une ou l'autre puisque &0xFF n'est qu'une limitation en 11111111 (255) ce qui est //** la limite pour chaque couleur donc on peut la supprimée (&0xFF) // ************************* le prmier choix //** return ((blue&0xFF)+((green&0xFF)<<8)+((red&0xFF)<<16)+(0xFF<<24)); // ***************************************** // ************************* le deuxieme choix return ((blue)+((green)<<8)+((red)<<16)+(0xFF<<24)); } //// *** convertir en tableau 1D pour un traitement en raster public int []tableau (BufferedImage img){ int w,h; int [] pixels; w= img.getWidth(); h= img.getHeight(); pixels = new int [w*h]; // pour comprendre le pixel graber PixelGrabber pg=new PixelGrabber(img,0,0,w,h,pixels,0,w); try{ pg.grabPixels(); } catch (InterruptedException e){ System.out.println(e.getMessage()); } return pixels; } //fonction de récuperation de la couleur rouge (canal rouge): public void canalR(){ image = new BufferedImage(larg,haut,BufferedImage.TYPE_INT_RGB); for (int i = 0; i < larg; i++) { for (int j = 0; j < haut; j++) { //récuperer la valeur RGB du pixel actuel (i,j) int RVB = buffeurActuel.getRGB(i, j); //récuperer la composante rouge partir de RGB du pixel actuel (i,j):...... (1) int r=getRed(RVB); image.setRGB(i, j, makeRGB(r,0,0)); } } panel2.repaint(); } //canal R with raster public void canalR_Rasrer(){ int r,i; int [] pixels; // w= buffeurActuel.getWidth(); // h= buffeurActuel.getHeight(); int [] resultat; resultat= new int [larg*haut]; pixels= tableau(buffeurActuel) ; for(i=0; i200)&&(g<200)&&(b<200)) rgb=new Color(r,0,0).getRGB(); image.setRGB(i, j, rgb); } } panel2.repaint(); } //gris with raster public void gris_Raster(){ int r,g,b,i; int [] pixels; int [] resultat; resultat= new int [larg*haut]; pixels= tableau(buffeurActuel) ; for(i=0; itab[j]){ x=tab[j]; tab[j]=tab[i]; tab[i]=x; } } } med=tab[4]; return med; } //////////////////ces fonctions permettent de calculer l'histogramme /////1-histogramme Gris void dessinerhisto(int tgris[]) { image = new BufferedImage(larg,haut,buffeurActuel.getType()); //int r=0; int s=0; int v = haut-20; for (int i=0;i<256;i++){ Graphics ggg = image.getGraphics(); ggg.setColor(Color.white); ggg.drawLine(i+3,v,i+3,v-(tgris[i]/20)); String r,r2 = null ; if (i%20==0) { r = toString().valueOf(tgris[i]); // pour etiqueter l'historamme ggg.setColor(Color.green); ggg.drawString(r, i+3,(v-20)-(tgris[i]/20));} if (i%50==0) { r2 = toString().valueOf(i); ggg.setColor(Color.white); ggg.drawString(r2, i+3,v+15);} ggg.dispose(); } } int[] Histogramme (BufferedImage img){ for (int i=0;i<256;i++){ tab[i]=0;} for (int i = 0; i < img.getWidth(); i++) { for (int j = 0; j < img.getHeight(); j++) { int RVB = img.getRGB(i, j); int r=(RVB>>16)& 0xFF; int g=(RVB>>8)& 0xFF; int b=(RVB)& 0xFF; int gr = (r+g+b)/3; tab[gr]=tab[gr]+1; } } return tab; } /////2-histogramme couleur void dessinerhistoC(int tcouleur[][]) { image = new BufferedImage(770,haut,buffeurActuel.getType()); // 770 pour avoir toute la largeur du panel2 // pour dessiner les histogrammes int v = haut-30; for (int i=0;i<256;i++){ Graphics ggg = image.getGraphics(); ggg.setColor(Color.red); ggg.drawLine(i+3,v,i+3,v-(tcouleur[i][0]/20)); String r,r2 = null ; if (i%20==0) { r = toString().valueOf(tcouleur[i][0]); // pour etiqueter l'historamme ggg.drawString(r, i+3,(v-20)-(tcouleur[i][0]/20));} if (i%50==0) { r2 = toString().valueOf(i); ggg.drawString(r2, i+3,v+10);} ggg.setColor(Color.green); ggg.drawLine(i+260,v,i+260,v-(tcouleur[i][1]/20)); if (i%20==0) { r = toString().valueOf(tcouleur[i][1]); // pour etiqueter l'historamme ggg.drawString(r, i+260,(v-20)-(tcouleur[i][1]/20));} if (i%50==0) { r2 = toString().valueOf(i); ggg.drawString(r2, i+260,v+10);} ggg.setColor(Color.blue); ggg.drawLine(i+517,v,i+517,v-(tcouleur[i][2]/20)); if (i%20==0) { r = toString().valueOf(tcouleur[i][2]); // pour etiqueter l'historamme ggg.drawString(r, i+517,(v-20)-(tcouleur[i][2]/20));} if (i%50==0) { r2 = toString().valueOf(i); ggg.drawString(r2, i+517,v+10);} ggg.dispose(); } Graphics ggg = image.getGraphics(); ggg.setColor(Color.white); // deux lignes cblanches pour separer les histogrammes ggg.drawLine(259,buffeurActuel.getHeight(),259,0); ggg.drawLine(516,buffeurActuel.getHeight(),516,0); ggg.setColor(Color.red); ggg.drawString("histogramme rouge", 128,buffeurActuel.getHeight()-10); ggg.setColor(Color.green); ggg.drawString("histogramme vert", 380,buffeurActuel.getHeight()-10); ggg.setColor(Color.blue); ggg.drawString("histogramme blue", larg-128,buffeurActuel.getHeight()-10); ggg.dispose(); } public int[][] HistogrammeC (BufferedImage img){ for (int i=0;i<256;i++){ tabC[i][0]=0; tabC[i][1]=0; tabC[i][2]=0; } for (int i = 0; i < img.getWidth(); i++) { for (int j = 0; j < img.getHeight(); j++) { int RVB = img.getRGB(i, j); int r=(RVB>>16)& 0xFF; int g=(RVB>>8)& 0xFF; int b=(RVB)& 0xFF; tabC[r][0]=tabC[r][0]+1; tabC[g][1]=tabC[g][1]+1; tabC[b][2]=tabC[b][2]+1; } } return tabC; } //////////// public static void main(String[] args) { TP_1 fenetre= new TP_1(); fenetre.frame.setVisible(true); } } //////////////