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 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
|
public class Histogramme extends JComponent {
private static final long serialVersionUID = 1L;
private BufferedImage image, histogramme;
private final int largeur = 256;
private final int hauteur = 200;
private final int[] rouge = new int[256];
private final int[] vert = new int[256];
private final int[] bleu = new int[256];
private int minBleu; // la valeur de seuil pour le bleu
private int minRouge; // la valeur de seuil pour le rouge
private int minVert; // la valeur de seuil pour le vert
private int maxRouge=0;
private int maxVert=0;
private int maxBleu=0;
private int sumRouge=0;
private int sumVert=0;
private int sumBleu=0;
private int medianeRouge=0;
private int medianeVert=0;
private int medianeBleu=0;
static int sum=0;
static int max =0;
static int position;
static int med;
public Histogramme(BufferedImage monImage){
image = monImage;
recupererRVB();
maxRouge = max(rouge);
maxVert = max(vert);
maxBleu = max(bleu);
sumRouge = sum(rouge);
sumVert = sum(vert);
sumBleu = sum(bleu);
medianeRouge = medianne(rouge);
medianeVert = medianne(vert);
medianeBleu = medianne(bleu);
tracerHistogrammes();
}
public void setMax(int max) {
this.max=max;
}
public void Setsum(int sum) {
this.sum=sum;
}
public void Setmed(int med) {
this.med=med;
}
public void setMinBleu(int minBleu) {
this.minBleu=minBleu;
repaint(); // provoque un redessin
}
public void setMinRouge(int minRouge) {
this.minRouge=minRouge;
repaint(); // provoque un redessin
}
public void setMinVert(int minVert) {
this.minVert=minVert;
repaint(); // provoque un redessin
}
protected void paintComponent(Graphics surface) {
// surface.drawImage(image, 0, 0, null);
surface.drawImage(histogramme,100, 100, null);
}
public int[] toArray(int argb) {
int[] array = new int[3];
array[0] = (argb >> 16 ) & 0xff;
array[1] = (argb >> 8 ) & 0xff;
array[2] = (argb) & 0xff;
return array;
}
private void recupererRVB() {
int maximum = 0;
for (int y=0; y<image.getHeight(); y++)
for (int x=0; x<image.getWidth(); x++) {
int[] rgb = toArray(image.getRGB(x, y));
rouge[rgb[0]]++;
vert[rgb[1]]++;
bleu[rgb[2]]++;
}
}
private void tracerHistogrammes() {
histogramme = new BufferedImage(largeur, hauteur, BufferedImage.TYPE_INT_ARGB);
Graphics2D dessin = histogramme.createGraphics();
Rectangle2D rectangle = new Rectangle2D.Double(0, 0, largeur-1, hauteur-1);
dessin.setPaint(new Color(1F, 1F, 1F, 0.2F));
dessin.fill(rectangle);
changerAxes(dessin);
dessin.setPaint(new Color(1F, 0F, 0F, 0.4F));
tracerHistogramme(dessin, rouge, minRouge, maxRouge, sumRouge, medianeRouge);
dessin.setPaint(new Color(0F, 1F, 0F, 0.4F));
tracerHistogramme(dessin, vert, minVert,maxVert,sumVert,medianeVert);
dessin.setPaint(new Color(0F, 0F, 1F, 0.4F));
tracerHistogramme(dessin, bleu, minBleu,maxBleu,sumBleu,medianeBleu);
dessin.dispose(); // toujours disposer aprés utilisation
}
private void changerAxes(Graphics2D dessin) {
dessin.translate(0, hauteur);
double surfaceImage = image.getWidth()*image.getHeight();
double surfaceHistogramme = histogramme.getWidth()*histogramme.getHeight();
dessin.scale(1, -surfaceHistogramme/surfaceImage/3.7);
}
private int max(int[] array) {
int max=0;
for(int i : array) {
max = Math.max(i,max);
}
return max;
}
private int sum(int[] array) {
int somme=0;
for(int i : array) {
somme += i ;
}
return somme;
}
private int medianne(int[] array) {
Boolean test=false;
int val = 0;
int mediane=0;
for(int i=0;i<255;i++) {
mediane += i ;
if(mediane>sum/2 && test!=true){
val=i;
test=true;
}
}
return val ;
}
private void tracerHistogramme(Graphics2D dessin, int[] couleur, int min , int max, int somme, int mediane) {
for (int i=0; i<couleur.length; i++)
if ( couleur[i]>min ) {
dessin.drawLine(i, 0, i, couleur[i]);
if ( couleur[i]==max ) {
position=i;
}
}
boolean dejaAffiche=false;
for(int i=0;i<couleur.length; i++){
if ( couleur[i]<=max/2 && !dejaAffiche ) {
System.out.println("Born A " +i);
dejaAffiche=true;
}
if ( couleur[i]==max ) {
System.out.println("Born B " +i);
dejaAffiche=false; // on veut afficher la première valeur de i tel que couleur[i]<= max/2 après max
}
}
setMax(max);
Setsum(somme);
Setmed(mediane);
}
} |
Partager