📄 histogramretriever.java
字号:
import java.awt.image.*;
//直方图修正
public class HistogramRetriever extends PointProcessor
{
//灰度出现的频数统计表,相当于灰度直方图
int FrequenceGray[];
//是否是灰色图像
boolean isGrayImage = true;
public HistogramRetriever()
{
this.type = this.PIXEL_GRAY_HISTOGRAM_EQUALIZE;
FrequenceGray = new int[256];
}
//设置图像是灰色图像还是彩色图像,当为彩色图像时,设为false
public void setImageProperty(boolean isGrayImage)
{
this.isGrayImage = isGrayImage;
}
public int[] obtainFrequencies(int[] pixels)
{
int nTotal = pixels.length;
ColorModel colorModel = ColorModel.getRGBdefault();
//像素循环:获取灰度频数统计表
int frequencies[] = new int[256];
for(int i = 0; i < nTotal;i++)
{
int r,g,b,gray;
if(this.isGrayImage)
gray = colorModel.getRed(pixels[i]);
else
{
r = colorModel.getRed(pixels[i]);
g = colorModel.getGreen(pixels[i]);
b = colorModel.getBlue(pixels[i]);
gray = (r * 30 + g * 59 + b * 11) / 100;
}
frequencies[gray]++;
}
return (frequencies);
}
//亮度修正
public boolean retrieveRGB(int[] src,int scansize,int[] dst)
{
if(scansize == 0)return false;
int height = src.length / scansize;
return (this.retrieveRGB(src,0,0,scansize,height,scansize,dst));
}
public boolean retrieveRGB(int[] src,int x,int y,int w,int h,int scansize,int[] dst)
{
if(scansize <= 0) return false;
int nTotal = src.length;
//原图像的宽度
int srcWidth = scansize;
int srcHeight = nTotal / scansize;
if((x > (scansize - 1)) || (y > (srcHeight - 1)))return false;
int width = w;
int height = h;
if((x + w) > scansize) width = scansize - x;
if((y + h) > srcHeight) height = srcHeight - y;
System.arraycopy(src,0,dst,0, nTotal);
ColorModel colorModel = ColorModel.getRGBdefault();
//像素循环:获取灰度统计表,记录原图像的像素灰度
int PixelsGray[] = new int[nTotal];
int i = 0;int j = 0;
for( i = 0; i < nTotal;i++)
{
int r,g,b,gray;
if(this.isGrayImage)
{
gray = colorModel.getRed(src[i]);
//gray = (gray < 0) ? 0 : ((gray > 255 ? 255 : gray);
}
else
{
r = colorModel.getRed(src[i]);
g = colorModel.getGreen(src[i]);
b = colorModel.getBlue(src[i]);
gray = (r * 30 + g * 59 + b * 11) / 100;
}
PixelsGray[i] = gray;
FrequenceGray[gray]++;
}
// 进行灰度均衡化
int SumGray[] = new int[256];
SumGray[0] = FrequenceGray[0];
for(i = 1;i < 256;i++)
SumGray[i] = SumGray[i- 1] + FrequenceGray[i];
for(i = 0;i < 256;i++)
SumGray[i] = (int)((SumGray[i] / (float)nTotal) * 255);
for(i = 0; i < height;i++)
{
int indexBase = (y + i) * scansize;
for(j = 0;j < width;j++)
{
int index = indexBase + x + j;
int r,g,b;
r = g = b = SumGray[PixelsGray[index]];
dst[index] = (0xFF000000 | (( r << 16 ) | ( g << 8 ) | b ));
}
}
return true;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -