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

Contribuez Discussion :

[Image/Java] Réduction du nombre de niveaux de gris


Sujet :

Contribuez

  1. #1
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut [Image/Java] Réduction du nombre de niveaux de gris
    Bonjour,

    voilà une toute petite contribution qui permet de réduire le nombre de niveaux de gris d'une image. Elle est particulièrement utile pour tout ce qui est matrices statistiques (GLCM, GLRLM, GLSZM).

    Voici une première contribution qui effectue une simple réduction part pas.
    Code java : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    package imageTiTi.reducer;
     
    import imageTiTi.Image;
     
    /**
     * <p>Description : Classe permettant de reduire le nombre de couleur de maniere classique.</p>
     * <p>Packages necessaires :</p>
     * <p>Dernieres modifications :<br>
     * 11 Avril 2010 => Creation. Recuperation des methodes qui etaient presentes dans la classe ImageConverter.</p>
     * <p>Copyright : Copyright (c) 2007.</p>
     * <p>Laboratoires/Equipes : CMM (Mines-ParisTech / ENSMP), I&M (ex LXAO) LSIS.</p>
     * 
     * @author Guillaume THIBAULT
     * @version 1.0
     */
     
    public class GrayLevelReducer implements ColorReducer
    {
     
    /** Methode qui reduit le nombre de niveaux de gris d'une image entre [1,nbGrayLevel[.
     *  La valeur 0 est placee pour les pixels egaux a ForbidenValue.
     * @param source L'image dont on souhaite reduire le nombre de niveaux de gris.
     * @param nbGrayLevel Le nombre de niveaux de gris souhaites.
     * @param ForbidenValue Valeur interdite dans l'image => a ne pas prendre en compte.
     * @return L'image avec les couleurs reduites.*/
    public Image Reduce(Image source, int nbGrayLevel, int ForbidenValue)
    	{
    	Image result = new Image(source.Width(), source.Height(), source.getType()) ;
    	Reduce(source, result, nbGrayLevel, ForbidenValue) ;
    	return result ;
    	}
     
     
    /** Methode qui reduit le nombre de niveaux de gris d'une image entre [1,nbGrayLevel[.
     *  La valeur 0 est placee pour les pixels egaux a ForbidenValue.
     * @param source L'image dont on souhaite reduire le nombre de niveaux de gris.
     * @param result L'image resultat (doit prealablement etre allouee).
     * @param nbGrayLevel Le nombre de niveaux de gris souhaites.
     * @param ForbidenValue Valeur interdite dans l'image => a ne pas prendre en compte.*/
    public void Reduce(Image source, Image result, int nbGrayLevel, int ForbidenValue)
    	{
    	if ( !source.isGrayLevel() ) throw new IllegalArgumentException("Gray level image required.") ;
     
    	int width = source.Width() ;
    	int height = source.Height() ;
    	double MaxGray ;
     
    	if ( source.getType() == Image.TYPE_BYTE_GRAY ) MaxGray = 256.0 ;
    	else MaxGray = 65636.0 ;
     
    	for (int y=0 ; y < height ; y++)
    		for (int x=0 ; x < width ; x++)
    			if ( source.Pixel(y, x) == ForbidenValue ) result.Pixel(y, x, 0) ; // 0 est pour la valeur interdite.
    			else result.Pixel(y,x,(int)((double)nbGrayLevel*(double)source.Pixel(y, x)/MaxGray)+1); // +1 car 0=ForbidenValue.
    	}
     
    }


    J'ajoute aussi l'interface utilisée pour rendre générique l'utilisation de ce genre de méthodes.
    Code java : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    package imageTiTi.reducer;
     
    import imageTiTi.Image;
     
    /**
     * <p>Description : Interface qui defini la forme d'une classe capable de reduire les couleurs d'une image.</p>
     * <p>Packages necessaires : utils.</p>
     * <p>Dernieres modifications :<br>
     * 11 Avril 2010 => Creation.</p>
     * <p>Copyright : Copyright (c) 2007.</p>
     * <p>Laboratoires/Equipes : CMM (Mines-ParisTech / ENSMP), I&M (ex LXAO) LSIS.</p>
     * 
     * @author Guillaume THIBAULT
     * @version 1.0
     * @see Image
     */
     
    public interface ColorReducer
    {
     
    /** Methode qui reduit le nombre de couleurs.
     * @param source L'image source.
     * @param nbGrayLevel Le nombre de niveaux de gris final.
     * @param ForbidenValue Valeur interdite <=> A ne pas prendre en compte, remplacee par 0.
     * @return L'image resultat.*/
    public Image Reduce(Image source, int nbGrayLevel, int ForbidenValue) ;
     
    /** Methode qui reduit le nombre de couleurs.
     * @param source L'image source.
     * @param result L'image resultat.
     * @param nbGrayLevel Le nombre de niveaux de gris final.
     * @param ForbidenValue Valeur interdite <=> A ne pas prendre en compte, remplacee par 0.*/
    public void Reduce(Image source, Image result, int nbGrayLevel, int ForbidenValue) ;
     
    }
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut Réduction des niveaux de gris par l'analyse de l'histogramme
    Une deuxième contribution qui utilise une petite analyse de l'histogramme pour réduire les niveaux de gris.

    Code java : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    package imageTiTi.reducer;
     
    import imageTiTi.Image;
    import imageTiTi.ImageTools;
    import measures.histogram.Histogram;
     
    /**
     * <p>Description : Classe permettant de reduire le nombre de couleur par l'utilisation de l'histogramme.</p>
     * <p>Packages necessaires : measures.</p>
     * <p>Dernieres modifications :<br>
     * 11 Avril 2010 => Creation. Recuperation des methodes qui etaient presentes dans la classe ImageConverter.</p>
     * <p>Copyright : Copyright (c) 2007.</p>
     * <p>Laboratoires/Equipes : CMM (Mines-ParisTech / ENSMP), I&M (ex LXAO) LSIS.</p>
     * 
     * @author Guillaume THIBAULT
     * @version 1.0
     */
     
    public class GrayLevelReducerHistogram implements ColorReducer
    {
     
    private Histogram histogram = new Histogram() ;
     
     
    /** Methode qui reduit le nombre de niveaux de gris d'une image entre [1,nbGrayLevel[,
     *  par une proportion sur l'histogramme cumule. La valeur 0 est placee pour les pixels egaux a ForbidenValue.
     * @param source L'image dont on souhaite reduire le nombre de niveaux de gris.
     * @param nbGrayLevel Le nombre de niveaux de gris souhaites.
     * @param ForbidenValue Valeur interdite dans l'image => a ne pas prendre en compte.
     * @return L'image avec les couleurs reduites.*/
    public Image Reduce(Image source, int nbGrayLevel, int ForbidenValue)
    	{
    	Image result = new Image(source.Width(), source.Height(), source.getType()) ;
    	Reduce(source, result, nbGrayLevel, ForbidenValue) ;
    	return result ;
    	}
     
     
    /** Methode qui reduit le nombre de niveaux de gris d'une image entre [1,nbGrayLevel[,
     *  par une proportion sur l'histogramme cumule. La valeur 0 est placee pour les pixels egaux a ForbidenValue.
     * @param source L'image dont on souhaite reduire le nombre de niveaux de gris.
     * @param result L'image resultat (doit prealablement etre allouee).
     * @param nbGrayLevel Le nombre de niveaux de gris souhaites.
     * @param ForbidenValue Valeur interdite dans l'image => a ne pas prendre en compte.*/
    public void Reduce(Image source, Image result, int nbGrayLevel, int ForbidenValue)
    	{
    	if ( !source.isGrayLevel() ) throw new IllegalArgumentException("Gray level image required.") ;
    	if ( !ImageTools.areDimensionsAndTypeEquals(source, result) )
    		throw new IllegalArgumentException("Images source and result must have identic dimensions and types.") ;
     
    	int width = source.Width() ;
    	int height = source.Height() ;
    	int x, y, MaxGray, nb, sum, Seuil ;
     
    	histogram.Fill(source) ;
    	int[] Values = histogram.getValues(0) ;
     
    	if ( source.getType() == Image.TYPE_BYTE_GRAY ) MaxGray = 256 ;
    	else MaxGray = 65636 ;
     
    	Seuil = 0 ;
    	for (x=0 ; x < MaxGray ; x++) // On calcule le nombre de pixels qui nous intéressent.
    		if ( x != ForbidenValue )
    			Seuil += Values[x] ;
    	Seuil /= nbGrayLevel ; // Nombre de pixel devant appartenir à une plage de couleur pour qu'elle soit complète.
     
    	int[] EquivalentNdg = new int[MaxGray] ;
    	sum = 0 ;
    	nb = 1 ;
    	for (x=0 ; x < MaxGray ; x++)
    		if ( x != ForbidenValue) // On ne travaille que sur les valeurs non nulles de l'histogramme
    			{
    			sum += Values[x] ; // On compte le nombre de pixels.
    			EquivalentNdg[x] = nb ; // On marque l'intensité.
    			if ( sum >= Seuil ) // Le nombre de pixel est suffisant, donc on peut passer à la composante suivante.
    				{
    				nb++ ;
    				sum = 0 ;
    				}
    			/*if ( Values[x] >= Seuil) // Cette intensité est auto-suffisante, on passe à la suivante.
    				{
    				EquivalentNdg[x] = nb++ ;
    				sum = 0 ;
    				}*/
    			}
    		else EquivalentNdg[x] = 0 ; // 0 pour la valeur interdite.
     
    	for (y=0 ; y < height ; y++)
    		for (x=0 ; x < width ; x++)
    			result.Pixel(y, x, EquivalentNdg[source.Pixel(y, x)]) ;
     
    	EquivalentNdg = null ;
    	Values = null ;
    	}
     
    }
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

Discussions similaires

  1. Forcer un nombre de niveaux de gris ?
    Par Gregoire31 dans le forum OpenCV
    Réponses: 1
    Dernier message: 03/02/2012, 09h42
  2. [image] Watershed (partage des eaux) en niveaux de gris
    Par pseudocode dans le forum Contribuez
    Réponses: 24
    Dernier message: 26/05/2011, 11h56
  3. Réponses: 18
    Dernier message: 20/10/2009, 16h39
  4. java extraire les niveaux de gris d'une image
    Par wildthing dans le forum Général Java
    Réponses: 11
    Dernier message: 20/05/2009, 13h41
  5. Savoir si une image est en couleur ou en niveaux de gris
    Par abir2007gallas dans le forum Images
    Réponses: 3
    Dernier message: 24/04/2008, 13h02

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