天天看點

圖像處理------直方圖均衡化

基本思想:

直方圖圖均衡化是圖像進行中的常用圖像增強手段,直方圖均衡化的主要優點是

可以降低圖像噪聲,提升圖像的局部顯示。對于常見的rgb圖像,直方圖均衡化

可以分别在三個顔色通道上處理,基本的直方圖均衡化的公式為:

圖像處理------直方圖均衡化

其中nj表示灰階級為rk的像素的個數,l為圖像中灰階總數,對于rgb來說l的

取值範圍為[0~255]總灰階級為256個。而r表示輸入圖像的直方圖資料。根據輸

出的灰階值sk計算出輸出像素的每個像素值,完成直方圖均衡化之後的像素處理

程式效果:

圖像處理------直方圖均衡化

源代碼:

package com.gloomyfish.filter.study;  

import java.awt.image.bufferedimage;  

public class histogramefilter extends abstractbufferedimageop{  

    @override  

    public bufferedimage filter(bufferedimage src, bufferedimage dest) {  

        int width = src.getwidth();  

        int height = src.getheight();  

        if ( dest == null )  

            dest = createcompatibledestimage( src, null );  

        int[] inpixels = new int[width*height];  

        int[] outpixels = new int[width*height];  

        getrgb( src, 0, 0, width, height, inpixels );  

        int[][] rgbhis = new int[3][256]; // rgb  

        int[][] newrgbhis = new int[3][256]; // after he  

        for(int i=0; i<3; i++) {  

            for(int j=0; j<256; j++) {  

                rgbhis[i][j] = 0;  

                newrgbhis[i][j] = 0;  

            }  

        }  

        int index = 0;  

        int totalpixelnumber = height * width;  

        for(int row=0; row<height; row++) {  

            int ta = 0, tr = 0, tg = 0, tb = 0;  

            for(int col=0; col<width; col++) {  

                index = row * width + col;  

                ta = (inpixels[index] >> 24) & 0xff;  

                tr = (inpixels[index] >> 16) & 0xff;  

                tg = (inpixels[index] >> 8) & 0xff;  

                tb = inpixels[index] & 0xff;  

                // generate original source image rgb histogram  

                rgbhis[0][tr]++;  

                rgbhis[1][tg]++;  

                rgbhis[2][tb]++;  

        // generate original source image rgb histogram  

        generatehedata(newrgbhis, rgbhis, totalpixelnumber, 256);  

                // get output pixel now...  

                tr = newrgbhis[0][tr];  

                tg = newrgbhis[1][tg];  

                tb = newrgbhis[2][tb];  

                outpixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;  

        setrgb( dest, 0, 0, width, height, outpixels );  

        return dest;  

    }  

    /** 

     *  

     * @param newrgbhis 

     * @param rgbhis 

     * @param totalpixelnumber 

     * @param graylevel [0 ~ 255] 

     */  

    private void generatehedata(int[][] newrgbhis, int[][] rgbhis, int totalpixelnumber, int graylevel) {  

        for(int i=0; i<graylevel; i++) {  

            newrgbhis[0][i] = getnewintensityrate(rgbhis[0], totalpixelnumber, i);  

            newrgbhis[1][i] = getnewintensityrate(rgbhis[1], totalpixelnumber, i);  

            newrgbhis[2][i] = getnewintensityrate(rgbhis[2], totalpixelnumber, i);  

    private int getnewintensityrate(int[] grayhis, double totalpixelnumber, int index) {  

        double sum = 0;  

        for(int i=0; i<=index; i++) {  

            sum += ((double)grayhis[i])/totalpixelnumber;  

        return (int)(sum * 255.0);  

}