Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / Java

Histogram Equalisation in Java

5.00/5 (1 vote)
24 Feb 2017CPOL1 min read 23.1K   551  
Enhance Image using Histogram Equalization

Introduction

Histogram equalisation is a technique used to enhance the contrast of image using the histogram of image. The histogram of image represents the frequency of gray levels in the image. The gray levels of image vary from 0 to 255, that is a gray scale image's pixel size is 8 bits(1 byte). So the histogram contains frequency of occurrence of values from 0 to 255.

The aim of histogram equalisation used in digital image processing is to generate an image with equally distributed brightness level over the whole brightness scale.

Histogram Equalization

Histogram equalisation can enhance contrast for brightness values close to histogram maxima and decrease contrast near minima.

Algorithm

Step 1. Image size: NxM, gray level from 0 to 255, create an array H of size 256 and initialise it with 0.

Step 2: Create image histogram by scanning every pixel of image and incrementing the relevant member of array.

Java
H[grayval(pix)] = H[grayval(pix)]+1

Step 3: Form a cumulative histogram CH of size 256.

Java
CH[0] = H[0]

CH[i] =  CH[i-1] + H[i], i=1,2,3,...255.

Step 4

Java
Set T[i] = Round((255*CH[i])/(NxM))

Step 5: Rescan image and create new image with gray level value.

Java
NewImg[x][y] = T[OldImg[x][y]]

Using the Code

The first thing to do is convert image to gray scale image. The function to convert image to gray scale image is defined.

Java
BufferedImage getGrayscaleImage(BufferedImage src) {
    BufferedImage gImg = new BufferedImage(src.getWidth(), src.getHeight(),
                         BufferedImage.TYPE_BYTE_GRAY);
    WritableRaster wr = src.getRaster();
    WritableRaster gr = gImg.getRaster();
    for(int i=0;i<wr.getWidth();i++){
        for(int j=0;j<wr.getHeight();j++){
            gr.setSample(i, j, 0, wr.getSample(i, j, 0));
        }
    }
    gImg.setData(gr);
    return gImg;
}

The second step is converting the gray scale image to enhanced, histogram equalised image. The algorithm stated above is implemented in the below function.

Java
BufferedImage equalize(BufferedImage src){
    BufferedImage nImg = new BufferedImage(src.getWidth(), src.getHeight(),
                         BufferedImage.TYPE_BYTE_GRAY);
    WritableRaster wr = src.getRaster();
    WritableRaster er = nImg.getRaster();
    int totpix= wr.getWidth()*wr.getHeight();
    int[] histogram = new int[256];

    for (int x = 0; x < wr.getWidth(); x++) {
        for (int y = 0; y < wr.getHeight(); y++) {
            histogram[wr.getSample(x, y, 0)]++;
        }
    }

    int[] chistogram = new int[256];
    chistogram[0] = histogram[0];
    for(int i=1;i<256;i++){
        chistogram[i] = chistogram[i-1] + histogram[i];
    }

    float[] arr = new float[256];
    for(int i=0;i<256;i++){
        arr[i] =  (float)((chistogram[i]*255.0)/(float)totpix);
    }

    for (int x = 0; x < wr.getWidth(); x++) {
        for (int y = 0; y < wr.getHeight(); y++) {
            int nVal = (int) arr[wr.getSample(x, y, 0)];
            er.setSample(x, y, 0, nVal);
        }
    }
    nImg.setData(er);
    return nImg;
}

Screenshots

Histogram Equalisation

Histogram Equalisation in Java: 1

Histogram Equalisation in Java

Histogram Equalisation in Java: 2

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)