图像处理之直方图均衡化

基本思想

直方图图均衡化是图像处理中的常用图像增强手段,直方图均衡化的主要优点是

可以降低图像噪声,提升图像的局部显示。对于常见的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> 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);         for(int row=0; row> 24) & 0xff;                 tr = (inPixels[index] >> 16) & 0xff;                 tg = (inPixels[index] >> 8) & 0xff;                 tb = inPixels[index] & 0xff;                  // 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 
  转载请务必注明