?? 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 + -