数字图像处理-直方图计算和灰度线性变换
##1.图像的读取和显示
###1.1图像的读取
重点是使用awt的Image类,java本身支持jepg,gif和png三种图像格式。
关键代码如下:
public Image openImage(String is, MediaTracker tracker )
{
Image im = null;
//用MediaTracker跟踪图像加载
im = Toolkit.getDefaultToolkit().getImage(is);
tracker.addImage(im,0);
//等待图像完成加载
try { tracker.waitForID(0); }
catch(InterruptedException e){ e.printStackTrace();}
return im;
}
###1.2图像的显示 代码实现如下:
//显示两幅图与第2幅图像标题
//im -- 输入图
//istr -- 输入图标题
//om -- 输出图
//ostr -- 输出图标题
public void draw(Graphics g, Image im, String istr, Image om, String ostr)
{
g.clearRect(0, 0, 530, 350);
g.drawImage(im, 5, 50, null);
g.drawImage(om, 270, 50, null);
g.drawString(istr, 120, 320);
g.drawString(ostr, 380, 320);
}
##2.直方图的计算 直方图的计算分别用$和$表示图像的宽度和高度。设灰度值$出现的频率为$,则直方图$可用下式计算:
代码实现:
public int[] getHist(int[] pix, int iw, int ih)
{
int[] hist = new int[256];
for(int i = 0; i < iw*ih; i++)
{
int grey = pix[i]&0xff;
hist[grey]++;
}
return hist;
}
##3.灰度的线性变换
###3.1彩色图像转变为灰度图像
彩色图像转换为灰度图像的函数表达式如下:
式中,记号$表示不超过x的最大整数。利用上式求出$值后,给输出图像的R、G、B分量都赋值$,就能转变成灰度图像。
代码实现:
//转变为灰度图像
public int[] toGray(int[] pix, int iw, int ih)
{
ColorModel cm = ColorModel.getRGBdefault();
int r, g, b, gray;
for(int i = 0; i < iw*ih; i++)
{
r = cm.getRed(pix[i]);
g = cm.getGreen(pix[i]);
b = cm.getBlue(pix[i]);
gray =(int)((r + g + b) / 3);
pix[i] = 255 << 24|gray << 16|gray << 8|gray;
}
return pix;
}
###3.2图像的灰度线性变换 记$为变换的斜率,$为截距,则灰度线性变换的数学公式如下:
代码实现:
//线性变换
public int[] linetrans(int[] pix, int iw, int ih,float p, int q)
{
ColorModel cm = ColorModel.getRGBdefault();
int r, g, b;
for(int i = 0; i < iw*ih; i++)
{
r = cm.getRed(pix[i]);
g = cm.getGreen(pix[i]);
b = cm.getBlue(pix[i]);
//增加图像亮度
r = (int)(p * r + q);
g = (int)(p * g + q);
b = (int)(p * b + q);
if(r >= 255) r = 255;
if(g >= 255) g = 255;
if(b >= 255) b = 255;
pix[i] = 255 << 24|r << 16|g << 8|b;
}
return pix;
}