1、图像处理作业图 像 处 理 作 业一、题目:编写程序对一个bmp图像统计直方图,并进行均衡化处理。二、程序完成情况: (一)、简介本程序采用java语言编写,在Borland JBuilder X下编译通过。由于本人在软件编程方面并不擅长,且java语言学习时间不长,程序内一定会有很多不合适的语句。谢谢老师在百忙之中批改我的作业! (二)程序界面1、主界面2、选择文件3、打开4、统计直方图5、均衡化处理6、处理后的直方图三、源程序Frame1.javapackage cl.lesson.txcl;import java.io.*;import java.awt.*;import java.aw
2、t.Toolkit;import java.awt.image.*;import .*;import .MalformedURLException;import java.awt.event.*;import javax.swing.*;import javax.swing.filechooser.FileFilter;import java.awt.Image;import java.awt.Toolkit;import java.awt.image.BufferedImage;import java.awt.image.MemoryImageSource;import java.io.Fi
3、leInputStream;import java.io.FileOutputStream;/java包调用/* * Title: * Description: * Copyright: Copyright (c) 2004 * Company: * 陈磊 * version 1.0 */文件信息public class Frame1 extends JFrame JPanel contentPane; JMenuBar jMenuBar1 = new JMenuBar(); JMenu jMenuFile = new JMenu(); JMenuItem jMenuFileExit = ne
4、w JMenuItem(); JMenu jMenuHelp = new JMenu(); JMenuItem jMenuHelpAbout = new JMenuItem(); JToolBar jToolBar = new JToolBar(); JButton jButton1 = new JButton(); JButton jButton2 = new JButton(); JButton jButton3 = new JButton(); ImageIcon image1; ImageIcon image2; ImageIcon image3; BorderLayout borde
5、rLayout1 = new BorderLayout(); JTabbedPane jTabbedPane1 = new JTabbedPane(); Toolkit tk; MediaTracker mtrack; Image img; int ImageWidth; int ImageHeight;/分别为图像的宽度与高度值 int PixelsSource;/ImageWidth*ImageHeigh String theFile; String theDir; Thread runMe; JMenuItem jMenuFileOpen = new JMenuItem(); JMenu
6、Item jMenuSave = new JMenuItem(); JMenu jMenuPlay = new JMenu(); JMenuItem jMenuItem1 = new JMenuItem(); JMenuItem jMenuItem2 = new JMenuItem(); /Construct the frame public Frame1() enableEvents(AWTEvent.WINDOW_EVENT_MASK); try jbInit(); catch(Exception e) e.printStackTrace(); /Component initializat
7、ion private void jbInit() throws Exception image1 = new ImageIcon(cl.lesson.txcl.Frame1.class.getResource(openFile.png); image2 = new ImageIcon(cl.lesson.txcl.Frame1.class.getResource(closeFile.png); image3 = new ImageIcon(cl.lesson.txcl.Frame1.class.getResource(help.png); contentPane = (JPanel) thi
8、s.getContentPane(); contentPane.setLayout(borderLayout1); this.setSize(new Dimension(533, 409); this.setTitle(图象处理); jMenuFile.setText(文件); jMenuFileExit.setText(离开); jMenuFileExit.addActionListener(new Frame1_jMenuFileExit_ActionAdapter(this); jMenuHelp.setToolTipText(); jMenuHelp.setText(帮助); jMen
9、uHelpAbout.setText(关于); jMenuHelpAbout.addActionListener(new Frame1_jMenuHelpAbout_ActionAdapter(this); jButton1.setIcon(image1); jButton1.addActionListener(new Frame1_jButton1_actionAdapter(this); jButton1.setToolTipText(打开文件); jButton2.setIcon(image2); jButton2.setToolTipText(存储文件); jButton3.setIc
10、on(image3); jButton3.addActionListener(new Frame1_jButton3_actionAdapter(this); jButton3.setToolTipText(帮助); contentPane.setAlignmentY(float) 0.5); contentPane.setDebugGraphicsOptions(0); contentPane.setToolTipText(); jMenuFileOpen.setToolTipText(); jMenuFileOpen.setText(打开); jMenuFileOpen.addAction
11、Listener(new Frame1_jMenuFileOpen_actionAdapter(this); jMenuSave.setText(存储); jMenuSave.addActionListener(new Frame1_jMenuSave_actionAdapter(this); jMenuPlay.setText(图像处理); jMenuItem1.setText(绘制直方图); jMenuItem1.addActionListener(new Frame1_jMenuItem1_actionAdapter(this); jMenuItem2.setText(均衡化处理); j
12、MenuItem2.addActionListener(new Frame1_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(jMenu
13、HelpAbout); jMenuBar1.add(jMenuFile); jMenuBar1.add(jMenuPlay); jMenuBar1.add(jMenuHelp); this.setJMenuBar(jMenuBar1); contentPane.add(jToolBar, BorderLayout.NORTH); jMenuPlay.add(jMenuItem1); jMenuPlay.add(jMenuItem2); /File | Exit action performed public void jMenuFileExit_actionPerformed(ActionEv
14、ent e) System.exit(0); /Help | About action performed public void jMenuHelpAbout_actionPerformed(ActionEvent e) Frame1_AboutBox dlg = new Frame1_AboutBox(this); Dimension dlgSize = dlg.getPreferredSize(); Dimension frmSize = getSize(); Point loc = getLocation(); dlg.setLocation(frmSize.width - dlgSi
15、ze.width) / 2 + loc.x, (frmSize.height - dlgSize.height) / 2 + loc.y); dlg.setModal(true); dlg.pack(); dlg.show(); /菜单说明帮助项 /Overridden so we can exit when window is closed protected void processWindowEvent(WindowEvent e) super.processWindowEvent(e); if (e.getID() = WindowEvent.WINDOW_CLOSING) jMenu
16、FileExit_actionPerformed(null); /菜单关闭项 void jButton3_actionPerformed(ActionEvent e) Frame1_AboutBox dlg = new Frame1_AboutBox(this); Dimension dlgSize = dlg.getPreferredSize(); Dimension frmSize = getSize(); Point loc = getLocation(); dlg.setLocation(frmSize.width - dlgSize.width) / 2 + loc.x, (frmS
17、ize.height - dlgSize.height) / 2 + loc.y); dlg.setModal(true); dlg.pack(); dlg.show(); /快捷图标帮助 public void getImageFromFile(String path) tk=Toolkit.getDefaultToolkit(); img = tk.getImage(path); /以下为主要内容,选择打开一个bmp图像文件,并对其分析读取。 void jButton1_actionPerformed(ActionEvent e) Image image; /构造一个目标图 String
18、result=; /返回结果 FileDialog fd = new FileDialog(this,请选择一个bmp图像文件!); fd.setMode(FileDialog.LOAD); fd.setVisible(true); theFile = fd.getFile(); theDir = fd.getDirectory(); String thePath = theDir+theFile; FileInputStream fs=new FileInputStream(thePath); int bflen=14; byte bf=new bytebflen; fs.read(bf,0
19、,bflen); /读取14字节BMP文件头 int bilen=40; byte bi=new bytebilen; fs.read(bi,0,bilen); /读取40字节BMP信息头 / 获取一些重要数据 int nwidth=(int)bi7&0xff)24) /源图宽度 | (int)bi6&0xff)16) | (int)bi5&0xff)8) | (int)bi4&0xff; System.out.println(宽:+nwidth); int nheight=(int)bi11&0xff)24) /源图高度 | (int)bi10&0xff)16) | (int)bi9&0xf
20、f)8) | (int)bi8&0xff; System.out.println(高:+nheight); /位数 int nbitcount=(int)bi15&0xff)8) | (int)bi14&0xff; System.out.println(位数:+nbitcount); /源图大小 int nsizeimage=(int)bi23&0xff)24) | (int)bi22&0xff)16) | (int)bi21&0xff)8) | (int)bi20&0xff; System.out.println(源图大小:+nsizeimage); /对24位BMP进行解析 if(nbit
21、count=24) int npad=(nsizeimage/nheight)-nwidth*3; int ndata=new intnheight*nwidth; byte brgb=new byte(nwidth+npad)*3*nheight; fs.read (brgb,0,(nwidth+npad)*3*nheight); int nindex=0; for(int j=0;jnheight;j+) for(int i=0;inwidth;i+) ndata nwidth*(nheight-j-1)+i= (255&0xff)24 | (int)brgbnindex+2&0xff)1
22、6) | (int)brgbnindex+1&0xff)8) | (int)brgbnindex&0xff; nindex+=3; nindex+=npad; Toolkit kit=Toolkit.getDefaultToolkit(); image=kit.createImage(new MemoryImageSource(nwidth,nheight, ndata,0,nwidth); result=从BMP得到图像image; System.out.println(从BMP得到图像image); else result=不是24位BMP,失败!; System.out.println(
23、不是24位BMP,失败!); image=(Image)null; fs.close(); /关闭输入流 /因为同时有菜单项和快捷图标,所以以下模块内容和上面这个模块一样。下面是菜单项打/开。 void jMenuFileOpen_actionPerformed(ActionEvent e) Image image; /构造一个目标图 String result=; /返回结果 FileDialog fd = new FileDialog(this,请选择一个bmp图像文件!); fd.setMode(FileDialog.LOAD); fd.setVisible(true); theFile
24、 = fd.getFile(); theDir = fd.getDirectory(); String thePath = theDir+theFile; FileInputStream fs=new FileInputStream(thePath); int bflen=14; byte bf=new bytebflen; fs.read(bf,0,bflen); /读取14字节BMP文件头 int bilen=40; byte bi=new bytebilen; fs.read(bi,0,bilen); /读取40字节BMP信息头 / 获取一些重要数据 int nwidth=(int)bi
25、7&0xff)24) /源图宽度 | (int)bi6&0xff)16) | (int)bi5&0xff)8) | (int)bi4&0xff; System.out.println(宽:+nwidth); int nheight=(int)bi11&0xff)24) /源图高度 | (int)bi10&0xff)16) | (int)bi9&0xff)8) | (int)bi8&0xff; System.out.println(高:+nheight); /位数 int nbitcount=(int)bi15&0xff)8) | (int)bi14&0xff; System.out.print
26、ln(位数:+nbitcount); /源图大小 int nsizeimage=(int)bi23&0xff)24) | (int)bi22&0xff)16) | (int)bi21&0xff)8) | (int)bi20&0xff; System.out.println(源图大小:+nsizeimage); /对24位BMP进行解析 if(nbitcount=24) int npad=(nsizeimage/nheight)-nwidth*3; int ndata=new intnheight*nwidth; byte brgb=new byte(nwidth+npad)*3*nheight
27、; fs.read (brgb,0,(nwidth+npad)*3*nheight); int nindex=0; for(int j=0;jnheight;j+) for(int i=0;inwidth;i+) ndata nwidth*(nheight-j-1)+i= (255&0xff)24 | (int)brgbnindex+2&0xff)16) | (int)brgbnindex+1&0xff)8) | (int)brgbnindex&0xff; nindex+=3; nindex+=npad; Toolkit kit=Toolkit.getDefaultToolkit(); ima
28、ge=kit.createImage(new MemoryImageSource(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存储图像 void jMenuSave_actionPerformed(ActionEvent e) Image image;
29、/构造一个目标图 int wideth=image.getWidth(null); /得到源图宽 int height=image.getHeight(null); /得到源图长 File outFile = new File(theDir,(theFile+.bmp); BufferedImage tag=new BufferedImage(wideth,height,BufferedImage.TYPE_INT_RGB); tag.getGraphics().drawImage(image,0,0,wideth,height,null); /绘制图 BufferedImage tag=new jTabbedPane1.createImage(wideth,height); Graphics2D g2=image.createGraphics(); jTabbedPane1.print(g2); BufferedOutputStream bos = new BufferedOutputStream( new FileOu