图像处理作业.docx
《图像处理作业.docx》由会员分享,可在线阅读,更多相关《图像处理作业.docx(30页珍藏版)》请在冰点文库上搜索。
图像处理作业
图像处理作业
一、题目:
编写程序对一个bmp图像统计直方图,并进行均衡化处理。
二、程序完成情况:
(一)、简介
本程序采用java语言编写,在BorlandJBuilderX下编译通过。
由于本人在软件编程方面并不擅长,且java语言学习时间不长,程序内一定会有很多不合适的语句。
谢谢老师在百忙之中批改我的作业!
(二)程序界面
1、主界面
2、选择文件
3、打开
4、统计直方图
5、均衡化处理
6、处理后的直方图
三、源程序
Frame1.java
packagecl.lesson.txcl;
importjava.io.*;
importjava.awt.*;
importjava.awt.Toolkit;
importjava.awt.image.*;
import.*;
import.MalformedURLException;
importjava.awt.event.*;
importjavax.swing.*;
importjavax.swing.filechooser.FileFilter;
importjava.awt.Image;
importjava.awt.Toolkit;
importjava.awt.image.BufferedImage;
importjava.awt.image.MemoryImageSource;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
//java包调用
/**
*
Title:
*
Description:
*
Copyright:
Copyright(c)2004
*
Company:
*@陈磊
*@version1.0
*/
//文件信息
publicclassFrame1extendsJFrame{
JPanelcontentPane;
JMenuBarjMenuBar1=newJMenuBar();
JMenujMenuFile=newJMenu();
JMenuItemjMenuFileExit=newJMenuItem();
JMenujMenuHelp=newJMenu();
JMenuItemjMenuHelpAbout=newJMenuItem();
JToolBarjToolBar=newJToolBar();
JButtonjButton1=newJButton();
JButtonjButton2=newJButton();
JButtonjButton3=newJButton();
ImageIconimage1;
ImageIconimage2;
ImageIconimage3;
BorderLayoutborderLayout1=newBorderLayout();
JTabbedPanejTabbedPane1=newJTabbedPane();
Toolkittk;
MediaTrackermtrack;
Imageimg;
intImageWidth;
intImageHeight;//分别为图像的宽度与高度值
intPixelsSource;//ImageWidth*ImageHeigh
StringtheFile;
StringtheDir;
ThreadrunMe;
JMenuItemjMenuFileOpen=newJMenuItem();
JMenuItemjMenuSave=newJMenuItem();
JMenujMenuPlay=newJMenu();
JMenuItemjMenuItem1=newJMenuItem();
JMenuItemjMenuItem2=newJMenuItem();
//Constructtheframe
publicFrame1(){
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try{
jbInit();
}
catch(Exceptione){
e.printStackTrace();
}
}
//Componentinitialization
privatevoidjbInit()throwsException{
image1=newImageIcon(cl.lesson.txcl.Frame1.class.getResource("openFile.png"));
image2=newImageIcon(cl.lesson.txcl.Frame1.class.getResource("closeFile.png"));
image3=newImageIcon(cl.lesson.txcl.Frame1.class.getResource("help.png"));
contentPane=(JPanel)this.getContentPane();
contentPane.setLayout(borderLayout1);
this.setSize(newDimension(533,409));
this.setTitle("图象处理");
jMenuFile.setText("文件");
jMenuFileExit.setText("离开");
jMenuFileExit.addActionListener(newFrame1_jMenuFileExit_ActionAdapter(this));
jMenuHelp.setToolTipText("");
jMenuHelp.setText("帮助");
jMenuHelpAbout.setText("关于");
jMenuHelpAbout.addActionListener(newFrame1_jMenuHelpAbout_ActionAdapter(this));
jButton1.setIcon(image1);
jButton1.addActionListener(newFrame1_jButton1_actionAdapter(this));
jButton1.setToolTipText("打开文件");
jButton2.setIcon(image2);
jButton2.setToolTipText("存储文件");
jButton3.setIcon(image3);
jButton3.addActionListener(newFrame1_jButton3_actionAdapter(this));
jButton3.setToolTipText("帮助");
contentPane.setAlignmentY((float)0.5);
contentPane.setDebugGraphicsOptions(0);
contentPane.setToolTipText("");
jMenuFileOpen.setToolTipText("");
jMenuFileOpen.setText("打开");
jMenuFileOpen.addActionListener(newFrame1_jMenuFileOpen_actionAdapter(this));
jMenuSave.setText("存储");
jMenuSave.addActionListener(newFrame1_jMenuSave_actionAdapter(this));
jMenuPlay.setText("图像处理");
jMenuItem1.setText("绘制直方图");
jMenuItem1.addActionListener(newFrame1_jMenuItem1_actionAdapter(this));
jMenuItem2.setText("均衡化处理");
jMenuItem2.addActionListener(newFrame1_jMenuItem2_actionAdapter(this));
jToolBar.add(jButton1);
jToolBar.add(jButton2);
jToolBar.add(jButton3);
contentPane.add(jTabbedPane1,BorderLayout.CENTER);
jMenuFile.add(jMenuFileOpen);
jMenuFile.add(jMenuSave);
jMenuFile.add(jMenuFileExit);
jMenuHelp.add(jMenuHelpAbout);
jMenuBar1.add(jMenuFile);
jMenuBar1.add(jMenuPlay);
jMenuBar1.add(jMenuHelp);
this.setJMenuBar(jMenuBar1);
contentPane.add(jToolBar,BorderLayout.NORTH);
jMenuPlay.add(jMenuItem1);
jMenuPlay.add(jMenuItem2);
}
//File|Exitactionperformed
publicvoidjMenuFileExit_actionPerformed(ActionEvente){
System.exit(0);
}
//Help|Aboutactionperformed
publicvoidjMenuHelpAbout_actionPerformed(ActionEvente){
Frame1_AboutBoxdlg=newFrame1_AboutBox(this);
DimensiondlgSize=dlg.getPreferredSize();
DimensionfrmSize=getSize();
Pointloc=getLocation();
dlg.setLocation((frmSize.width-dlgSize.width)/2+loc.x,(frmSize.height-dlgSize.height)/2+loc.y);
dlg.setModal(true);
dlg.pack();
dlg.show();
}
//菜单说明帮助项
//Overriddensowecanexitwhenwindowisclosed
protectedvoidprocessWindowEvent(WindowEvente){
super.processWindowEvent(e);
if(e.getID()==WindowEvent.WINDOW_CLOSING){
jMenuFileExit_actionPerformed(null);
}
}
//菜单关闭项
voidjButton3_actionPerformed(ActionEvente){
Frame1_AboutBoxdlg=newFrame1_AboutBox(this);
DimensiondlgSize=dlg.getPreferredSize();
DimensionfrmSize=getSize();
Pointloc=getLocation();
dlg.setLocation((frmSize.width-dlgSize.width)/2+loc.x,(frmSize.height-dlgSize.height)/2+loc.y);
dlg.setModal(true);
dlg.pack();
dlg.show();
}
//快捷图标帮助
publicvoidgetImageFromFile(Stringpath)
{
tk=Toolkit.getDefaultToolkit();
img=tk.getImage(path);
}
//以下为主要内容,选择打开一个bmp图像文件,并对其分析读取。
voidjButton1_actionPerformed(ActionEvente){
Imageimage;//构造一个目标图
Stringresult="";//返回结果
FileDialogfd=newFileDialog(this,"请选择一个bmp图像文件!
");
fd.setMode(FileDialog.LOAD);
fd.setVisible(true);
theFile=fd.getFile();
theDir=fd.getDirectory();
StringthePath=theDir+theFile;
FileInputStreamfs=newFileInputStream(thePath);
intbflen=14;
bytebf[]=newbyte[bflen];
fs.read(bf,0,bflen);//读取14字节BMP文件头
intbilen=40;
bytebi[]=newbyte[bilen];
fs.read(bi,0,bilen);//读取40字节BMP信息头
//获取一些重要数据
intnwidth=(((int)bi[7]&0xff)<<24)//源图宽度
|(((int)bi[6]&0xff)<<16)
|(((int)bi[5]&0xff)<<8)
|(int)bi[4]&0xff;
System.out.println("宽:
"+nwidth);
intnheight=(((int)bi[11]&0xff)<<24)//源图高度
|(((int)bi[10]&0xff)<<16)
|(((int)bi[9]&0xff)<<8)
|(int)bi[8]&0xff;
System.out.println("高:
"+nheight);
//位数
intnbitcount=(((int)bi[15]&0xff)<<8)|(int)bi[14]&0xff;
System.out.println("位数:
"+nbitcount);
//源图大小
intnsizeimage=(((int)bi[23]&0xff)<<24)
|(((int)bi[22]&0xff)<<16)
|(((int)bi[21]&0xff)<<8)
|(int)bi[20]&0xff;
System.out.println("源图大小:
"+nsizeimage);
//对24位BMP进行解析
if(nbitcount==24){
intnpad=(nsizeimage/nheight)-nwidth*3;
intndata[]=newint[nheight*nwidth];
bytebrgb[]=newbyte[(nwidth+npad)*3*nheight];
fs.read(brgb,0,(nwidth+npad)*3*nheight);
intnindex=0;
for(intj=0;jfor(inti=0;indata[nwidth*(nheight-j-1)+i]=
(255&0xff)<<24
|(((int)brgb[nindex+2]&0xff)<<16)
|(((int)brgb[nindex+1]&0xff)<<8)
|(int)brgb[nindex]&0xff;
nindex+=3;
}
nindex+=npad;
}
Toolkitkit=Toolkit.getDefaultToolkit();
image=kit.createImage(newMemoryImageSource(nwidth,nheight,
ndata,0,nwidth));
result="从BMP得到图像image";
System.out.println("从BMP得到图像image");
}else{
result="不是24位BMP,失败!
";
System.out.println("不是24位BMP,失败!
");
image=(Image)null;
}
fs.close();//关闭输入流
}
//因为同时有菜单项和快捷图标,所以以下模块内容和上面这个模块一样。
下面是菜单项打//开。
voidjMenuFileOpen_actionPerformed(ActionEvente){
Imageimage;//构造一个目标图
Stringresult="";//返回结果
FileDialogfd=newFileDialog(this,"请选择一个bmp图像文件!
");
fd.setMode(FileDialog.LOAD);
fd.setVisible(true);
theFile=fd.getFile();
theDir=fd.getDirectory();
StringthePath=theDir+theFile;
FileInputStreamfs=newFileInputStream(thePath);
intbflen=14;
bytebf[]=newbyte[bflen];
fs.read(bf,0,bflen);//读取14字节BMP文件头
intbilen=40;
bytebi[]=newbyte[bilen];
fs.read(bi,0,bilen);//读取40字节BMP信息头
//获取一些重要数据
intnwidth=(((int)bi[7]&0xff)<<24)//源图宽度
|(((int)bi[6]&0xff)<<16)
|(((int)bi[5]&0xff)<<8)
|(int)bi[4]&0xff;
System.out.println("宽:
"+nwidth);
intnheight=(((int)bi[11]&0xff)<<24)//源图高度
|(((int)bi[10]&0xff)<<16)
|(((int)bi[9]&0xff)<<8)
|(int)bi[8]&0xff;
System.out.println("高:
"+nheight);
//位数
intnbitcount=(((int)bi[15]&0xff)<<8)|(int)bi[14]&0xff;
System.out.println("位数:
"+nbitcount);
//源图大小
intnsizeimage=(((int)bi[23]&0xff)<<24)
|(((int)bi[22]&0xff)<<16)
|(((int)bi[21]&0xff)<<8)
|(int)bi[20]&0xff;
System.out.println("源图大小:
"+nsizeimage);
//对24位BMP进行解析
if(nbitcount==24){
intnpad=(nsizeimage/nheight)-nwidth*3;
intndata[]=newint[nheight*nwidth];
bytebrgb[]=newbyte[(nwidth+npad)*3*nheight];
fs.read(brgb,0,(nwidth+npad)*3*nheight);
intnindex=0;
for(intj=0;jfor(inti=0;indata[nwidth*(nheight-j-1)+i]=
(255&0xff)<<24
|(((int)brgb[nindex+2]&0xff)<<16)
|(((int)brgb[nindex+1]&0xff)<<8)
|(int)brgb[nindex]&0xff;
nindex+=3;
}
nindex+=npad;
}
Toolkitkit=Toolkit.getDefaultToolkit();
image=kit.createImage(newMemoryImageSource(nwidth,nheight,
ndata,0,nwidth));
result="从BMP得到图像image";
System.out.println("从BMP得到图像image");
}else{
result="不是24位BMP,失败!
";
System.out.println("不是24位BMP,失败!
");
image=(Image)null;
}
fs.close();//关闭输入流
}
//从Panel存储图像
voidjMenuSave_actionPerformed(ActionEvente){
Imageimage;//构造一个目标图
intwideth=image.getWidth(null);//得到源图宽
intheight=image.getHeight(null);//得到源图长
FileoutFile=newFile(theDir,(theFile+".bmp"));
BufferedImagetag=newBufferedImage(wideth,height,BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(image,0,0,wideth,height,null);//绘制图
BufferedImagetag=newjTabbedPane1.createImage(wideth,height);
Graphics2Dg2=image.createGraphics();
jTabbedPane1.print(g2);
BufferedOutputStreambos=newBufferedOutputStream(newFileOu