import imp.*;
import java.awt.Color;

public class Histogramme
{
    public  int[] haeufigkeitsverteilung(Picture originalbild) {
        int breite = originalbild.getWidth();
        int hoehe  = originalbild.getHeight();

        Color[][] pixel = originalbild.getPixelArray();
        int[] haeufigkeiten = new int[256];

        for(int i = 0;i < 256; i++){
            haeufigkeiten[i]=0;
        }
        for (int x = 0; x < breite; x++){ 
            for (int y = 0; y < hoehe; y++) 
            { 
                int grau = (pixel[x][y].getRed()+pixel[x][y].getGreen()+pixel[x][y].getBlue())/3;
                haeufigkeiten[grau]++;
            } 
        }
        return haeufigkeiten;
    }
    
    
    public  Picture zeichneHistogramm(int[] haeufigkeiten) {
           
        Picture neuesBild = new Picture(256,100,"C0C0C0");
        neuesBild.stroke(0);

        int max = 0;
        for(int x = 0;x < 256;x++) {
           if (haeufigkeiten[x]>max) max = haeufigkeiten[x];
        }

        for(int x = 0;x < 256;x++) {
            int  a;
            a = haeufigkeiten[x]*100/max;
            neuesBild.line(x, 100-a, x, 100);
        }
        return neuesBild;
    }
    
    public Picture histogrammAnpassen(Picture originalbild, int[] zuordnung) {
        int breite = originalbild.getWidth();
        int hoehe  = originalbild.getHeight();

        Color[][] pixel = originalbild.getPixelArray();
        Color[][] pixelNeu = new Color[breite][hoehe];
        for (int x = 0; x < breite ; x++){ 
            for (int y = 0; y < hoehe ; y++) 
            { 
                int rotalt = pixel[x][y].getRed();
                int gruenalt = pixel[x][y].getGreen();
                int blaualt = pixel[x][y].getBlue();
                
                int rotneu = zuordnung[rotalt];
                int gruenneu = zuordnung[gruenalt];
                int blauneu = zuordnung[blaualt];
                
                pixelNeu[x][y] = new Color(rotneu,gruenneu,blauneu);

            } 
        }
        Picture neuesBild = new Picture(); 
        neuesBild.setPixelArray(pixelNeu); 
        return neuesBild;
    }   
 
    
    public Picture lineareHistogrammanpassung(Picture originalbild, int unten, int oben){
        int[] zuordnung = new int[256];
        for(int i=0; i < 256; i++) {
            if(i<unten) zuordnung[i] = 0;
            if(i>=oben) zuordnung[i] = 255;
            if(i>=unten && i <oben) zuordnung[i] = 255*(i-unten)/(oben-unten);
        }
        return histogrammAnpassen(originalbild, zuordnung);
    }
    
    public Picture automatischeHistogrammaequilisation(Picture originalbild) {
        int[] haeufigkeit = haeufigkeitsverteilung(originalbild);
        int[] zuordnung = new int[256];
        int gesamtpixel = originalbild.getWidth()*originalbild.getHeight();
        int summe = 0;
        for(int i=0; i < 256; i++) {
            summe = summe + haeufigkeit[i];
            zuordnung[i] = 255 * summe / gesamtpixel;
        }
        return histogrammAnpassen(originalbild, zuordnung);
    }
    
    public Picture gammakorrektur(Picture originalbild, double gamma) {
       int[] zuordnung = new int[256];
       for(int i=0; i <256; i++) {
           zuordnung[i] = (int) (Math.pow( ((double) i)/255.0, gamma) * 255.0); 
        }
        return histogrammAnpassen(originalbild, zuordnung);
    }
 
}
