⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 histogram.java

📁 对图象进行均匀化处理
💻 JAVA
字号:
//Histogram.java
/*
	程序说明:对图像进行直方图均匀化处理,显示图像的直方图.
	
	程序修改:
	
	最后修改时间:2003-12
	
	作者:haibin
	
*/

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;

public class Histogram extends Frame {
	Image im,tmp;
	int i,iw,ih;
	int[] pixels;
	boolean flagLoad=false;
	boolean flagGrey=false;
	
	//构造方法
	public Histogram(){
		this.setTitle("图像的直方图均匀化");
		
		Panel pdown;
		Button load,grey,hist,run,save,quit;
		//添加窗口监听事件
		addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		
		pdown = new Panel();
		pdown.setBackground(Color.lightGray);
		
		load=new Button("装载图像");
		grey=new Button("灰度图像");
		hist=new Button("直方图");
		run=new Button("均匀化");
		save=new Button("保存");
		quit=new Button("退出");
		
		this.add(pdown,BorderLayout.SOUTH);
		
		pdown.add(load);
		pdown.add(grey);
		pdown.add(hist);
		pdown.add(run);
		pdown.add(save);
		pdown.add(quit);
		
		load.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				jLoad_ActionPerformed(e);
			}
		});
		
		hist.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				jHist_ActionPerformed(e);
			}
		});
		
		grey.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				jGrey_ActionPerformed(e);
			}
		});
		
		run.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				jRun_ActionPerformed(e);
			}
		});
		
		quit.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				jQuit_ActionPerformed(e);
			}
		});
		save.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				jSave_ActionPerformed(e);
			}
		});
	}
		
	public void jLoad_ActionPerformed(ActionEvent e){
		//利用MediaTracker跟踪图像的加载
		MediaTracker tracker = new MediaTracker(this);
		im=Toolkit.getDefaultToolkit().getImage("Miss.jpg");
		tracker.addImage(im,0);
	
		//等待图像的完全加载
		try{
		tracker.waitForID(0);
 		}catch(InterruptedException e2){ e2.printStackTrace();}
 	
 		//获取图像的宽度iw和高度ih
		iw=im.getWidth(this);
		ih=im.getHeight(this);
		pixels=new int[iw*ih];
		
		try{
		PixelGrabber pg=new PixelGrabber(im,0,0,iw,ih,pixels,0,iw);
		pg.grabPixels();
		}catch (InterruptedException e3) {
			e3.printStackTrace();
		}
	
		//获得图像的RGB值和Alpha值
		ColorModel cm=ColorModel.getRGBdefault();
		for(i=0;i<iw*ih;i++)
		{
			int alpha=cm.getAlpha(pixels[i]);
			int red=cm.getRed(pixels[i]);
			int green=cm.getGreen(pixels[i]);
			int blue=cm.getBlue(pixels[i]);
			pixels[i]=alpha<<24|red<<16|green<<8|blue;
		}
	
		//将数组中的象素产生一个图像
		ImageProducer ip=new MemoryImageSource(iw,ih,pixels,0,iw);
		tmp=createImage(ip);
		flagLoad=true;
		repaint();
	}
	
	public void jGrey_ActionPerformed(ActionEvent e){
		//必须保证图像进行了加载,然后才可以进行灰度化
		if(flagLoad){
		try{
		PixelGrabber pg=new PixelGrabber(im,0,0,iw,ih,pixels,0,iw);
		pg.grabPixels();
		}catch (InterruptedException e3) {
			e3.printStackTrace();
		}
		
		ColorModel cm=ColorModel.getRGBdefault();
		for(i=0;i<ih;i++)
		{
			for(int j=0;j<iw;j++)
			{
				int alpha=cm.getAlpha(pixels[i*iw+j]);
				int red=cm.getRed(pixels[i*iw+j]);
				int green=cm.getGreen(pixels[i*iw+j]);
				int blue=cm.getBlue(pixels[i*iw+j]);
				
				int grey=(int)(0.3*red+0.59*green+0.11*blue);
				
				pixels[i*iw+j]=alpha<<24|grey<<16|grey<<8|grey;
			}
		}
		//将数组中的象素产生一个图像
		ImageProducer ip=new MemoryImageSource(iw,ih,pixels,0,iw);
		tmp=createImage(ip);
		flagGrey=true;
		repaint();
			
	}else{
		 JOptionPane.showMessageDialog(null,"请先打开一幅图片!",
                         "Alert",JOptionPane.WARNING_MESSAGE);
		}
	}
	
	public void jHist_ActionPerformed(ActionEvent e){
		//图像已经加载,并且变成了灰度图像
		if(flagLoad && flagGrey){
	
		//显示图像的直方图
		Hist h=new Hist();
		
		//传送数据
		h.getData(pixels,iw,ih);
		h.setLocation(50,50);
		h.setSize(480,300);
		h.show();
		
		}else{
		 JOptionPane.showMessageDialog(null,"请先打开一幅图片,或者把该图片变为灰度图像!",
                         "Alert",JOptionPane.WARNING_MESSAGE);
		}
	}
	
	//对图像进行直方图均匀化处理
	public  void jRun_ActionPerformed(ActionEvent e){
		//图像已经加载,并且变成了灰度图像
		if(flagLoad && flagGrey){
				
		//获取图像的直方图
		int [] histogram=new int [256];
		ColorModel cm=ColorModel.getRGBdefault();
		for(i=0;i<ih;i++)
		{
			for(int j=0;j<iw;j++)
			{
				int grey=pixels[i*iw+j]&0xff;
				histogram[grey]++;
			}
		}
		//直方图均匀化处理
		double a=(double)255/(iw*ih);
		double [] c=new double [256];
		c[0]=(a*histogram[0]);
		for(i=1;i<256;i++)
		{
			c[i]=c[i-1]+(int)(a*histogram[i]);
		}
		for(i=0;i<ih;i++)
		{
			for(int j=0;j<iw;j++)
			{
				int alpha=cm.getAlpha(pixels[i*iw+j]);
				int grey=pixels[i*iw+j]&0x0000ff;
				int hist=(int)c[grey];
				
				pixels[i*iw+j]=alpha<<24|hist<<16|hist<<8|hist;
 				
			}
		}
		//将数组中的象素产生一个图像
		ImageProducer ip=new MemoryImageSource(iw,ih,pixels,0,iw);
		tmp=createImage(ip);

		repaint();
	}else{
		 JOptionPane.showMessageDialog(null,"请先打开一幅图片,或者把该图片变为灰度图像!",
                         "Alert",JOptionPane.WARNING_MESSAGE);
		}
	}
	public void jSave_ActionPerformed(ActionEvent e){
		//Save Image
	}
	
	public void jQuit_ActionPerformed(ActionEvent e){
		//System.exit(0);
		JOptionPane op =new JOptionPane();
		int exit=op.showConfirmDialog(this,"你要退出吗? ? ?","退出",JOptionPane.YES_NO_OPTION);
		
		if(exit==JOptionPane.YES_OPTION)
		{
			System.exit(0);
			
		}else{ }
	}

	//调用paint()方法,显示图像信息。
	public void paint(Graphics g){
		if(flagLoad){
			g.drawImage(tmp,10,20,this);
		}else { }
	}
	
	//定义main方法,设置窗口的大小,显示窗口
	public static void main(String[] args) {
		Histogram hist = new Histogram();
		hist.setLocation(50,50);
		hist.setSize(500,400);
		hist.show();
	} 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -