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 ;
}
} |
Partager