IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Graphisme Java Discussion :

[Filtre]Convertir une image en noir et blanc


Sujet :

Graphisme Java

  1. #1
    Membre régulier Avatar de Bourak
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 231
    Points : 84
    Points
    84
    Par défaut [Filtre]Convertir une image en noir et blanc
    Bonjour les Développeurs.

    J'ai retourner pour la programmation en java et surtout en graphique et je cherche des méthodes pour optimiser le traitement des images.
    Bref, j'utilise une méthode pour convertir une image couleur du type BufferedImage en noir et blanc et voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     public static BufferedImage BlackCouleur(BufferedImage img ) {
            BufferedImage image=img; 
            int w = image.getWidth();
            int h = image.getHeight();
            int  colB=new Color(255,255,255).getRGB();
            int  colN=new Color(1,1,1).getRGB();
            int  colMoyen=(colB + colN)/2;
            for (int x=0; x<w; x++) {
                for (int y=0;y<h; y++) {
                    int k =image.getRGB(x, y);
     
                   if (k <=colMoyen )
                     image.setRGB(x,y ,colN);
                   if (k >colMoyen)
                     image.setRGB(x,y,colB);          
     
                }
            }
            return  image;
        }
    Mon question est ce qu'il y a une autre méthode plus rapide que celle-ci. car je travail sur un projet qui veut une résultat rapide pour passer à des autres étapes.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    : ici.

  3. #3
    Membre régulier Avatar de Bourak
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 231
    Points : 84
    Points
    84
    Par défaut
    Merci dinobogan pour votre aide.

    Mai comme vous voyez dans mon programme je ne veut que 2 couleur (noir et blanc) et pas de niveau de gris. S'il y a une autre méthode au lieu de passé pixel par pixel ça sera un grand pas dans mon programme.

    J'espère que j'ai bien expliquer.

    Quand même c'est bien cet outil et il m'aide dans mon programme.

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Cette image est destinée à être affichée ? A être à nouveau modifiée par la suite ?

  5. #5
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 189
    Points : 268
    Points
    268
    Par défaut
    A noter que tu as Color.BLACK et Color.WHITE.

    Et faire ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int  colMoyen=(colB + colN)/2;
    Ca ne risque pas de marcher ça

  6. #6
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Il va bien avoir une image en noir et blanc, mais disons qu'elle se basera sur le niveau de rouge et pas sur la luminosité (le niveau de gris)

  7. #7
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Il existe une classe GrayFilter dans le JDK qui transforme une image en niveau de gris.

    J'ai honteusement repompé cette classe pour faire ce que tu veux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class MyTransformer extends RGBImageFilter
    {
     
        public static Image transformImage(Image i)
        {
            ImageProducer prod = new FilteredImageSource(i.getSource(), new MyTransformer());
            Image result = Toolkit.getDefaultToolkit().createImage(prod);
            return result;
        }
     
        @Override
        public int filterRGB(int x, int y, int rgb)
        {
            int gray = (int) ((0.30 * ((rgb >> 16) & 0xff) + 0.59 * ((rgb >> 8) & 0xff) + 0.11 * (rgb & 0xff)) / 3);
     
            if (gray < 128)
                return Color.BLACK.getRGB();
     
            return Color.WHITE.getRGB();
        }
     
    }
    voici au moins une structure qui te permet de faire un traitement sans avoir à parcourir les pixels.

  8. #8
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 189
    Points : 268
    Points
    268
    Par défaut
    Citation Envoyé par Deaf Voir le message
    Il existe une classe GrayFilter dans le JDK qui transforme une image en niveau de gris.
    En fait, il ne voulait pas une image en niveau de gris, mais une image noir et blanc (donc un seuillage binaire) (edit : non, j'ai rien dit, j'ai cru que tu retournais gray, au temps pour moi)

    On peut par contre utiliser ceci à la place de ta méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	public int computePoint(int rgb) {
    		int gray = (int)((0.30 * ((rgb >> 16) & 0xff) + 
    				0.59 * ((rgb >> 8) & 0xff) + 
    				0.11 * (rgb & 0xff)));
    		if(gray<limit)
    			return 0;
    		else
    			return white;
    	}
    private int white = Color.WHITE.getRGB();

  9. #9
    Membre régulier Avatar de Bourak
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 231
    Points : 84
    Points
    84
    Par défaut
    Merci à tous

    Citation Envoyé par dinobogan Voir le message
    Cette image est destinée à être affichée ? A être à nouveau modifiée par la suite ?
    cette image sera affiché dans une etape puis sera modifier par d'autre filtre.

    Et voici un exemple d'une image avant et après le filtrage.
    Images attachées Images attachées   

  10. #10
    Membre régulier Avatar de Bourak
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 231
    Points : 84
    Points
    84
    Par défaut
    Merci pour votre aide

    S'il vous plait je ne suis pas fort en java , veuillez m'aide à transformer le code envoyé par Deaf en utilisant BufferedImage au lieu de Image.

    Merci d'avance

  11. #11
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Une BufferedImage est une Image, donc tu peux utiliser ma méthode pour transformer tes BufferedImage.

    Après, tu récupères une Image et non BufferedImage. Mais, est-ce grave?
    Est-ce que tu utilises une méthode de BufferedImage qui n'est pas dans Image après?

    C'est possible, mais si tu te contentes d'appeler des filtres successifs, Image te suffira

  12. #12
    Membre régulier Avatar de Bourak
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 231
    Points : 84
    Points
    84
    Par défaut
    Merci Deaf pour votre aide mais c'est un niveau de gris la résultat et pas un noir et blanc comme il a dit Jack Sparrow .
    Même votre méthode jack ne donne pas la résultat voulu.

    Citation Envoyé par Jack Sparrow Voir le message
    En fait, il ne voulait pas une image en niveau de gris, mais une image noir et blanc (donc un seuillage binaire) (edit : non, j'ai rien dit, j'ai cru que tu retournais gray, au temps pour moi)

    On peut par contre utiliser ceci à la place de ta méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	public int computePoint(int rgb) {
    		int gray = (int)((0.30 * ((rgb >> 16) & 0xff) + 
    				0.59 * ((rgb >> 8) & 0xff) + 
    				0.11 * (rgb & 0xff)));
    		if(gray<limit)
    			return 0;
    		else
    			return white;
    	}
    private int white = Color.WHITE.getRGB();

  13. #13
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Citation Envoyé par Jack Sparrow Voir le message
    (edit : non, j'ai rien dit, j'ai cru que tu retournais gray, au temps pour moi)
    Non, non, elle fait bien du noir et blanc

  14. #14
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 189
    Points : 268
    Points
    268
    Par défaut
    Citation Envoyé par Bourak Voir le message
    Merci Deaf pour votre aide mais c'est un niveau de gris la résultat et pas un noir et blanc comme il a dit Jack Sparrow .
    Même votre méthode jack ne donne pas la résultat voulu.

    Il faut regler la limite au seuil que tu veux.

    Mais il y a plusieurs techniques de seuillage binaire. Celui proposé par Deaf est moi (c'est le même algo) est tout de même simpliste.

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/01/2014, 10h06
  2. [Galerie] Fonction pour convertir une image en noir et blanc
    Par piotrr dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 10/02/2009, 12h23
  3. Convertir les images en noir et blanc
    Par piotrr dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 09/02/2009, 18h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo