您的位置:首页 > 编程语言 > Java开发

java实现图象灰度转换,腐蚀,均衡化

2008-06-19 15:32 127 查看
package com.test;

import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;

public class ColorPaint extends JFrame {

//保存当前操作的像素矩阵
private int currentPixArray[]=null;

//图像的路径
private String fileString=null;
//用于显示图像的标签
private JLabel imageLabel=null;

//加载的图像
private BufferedImage newImage;

//图像的高和宽
private int h,w;

//保存历史操作图像矩阵
private LinkedList<int[]> imageStack=new LinkedList<int[]>();
private LinkedList<int[]> tempImageStack=new LinkedList<int[]>();

public ColorPaint(String title){
super(title);
this.setSize(800,600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//创建菜单
JMenuBar jb=new JMenuBar();
JMenu fileMenu=new JMenu("文件");
jb.add(fileMenu);

JMenuItem openImageMenuItem=new JMenuItem("打开图像");
fileMenu.add(openImageMenuItem);
openImageMenuItem.addActionListener(new OpenListener());

JMenuItem exitMenu=new JMenuItem("退出");
fileMenu.add(exitMenu);
exitMenu.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});

JMenu operateMenu=new JMenu("图像处理");
jb.add(operateMenu);

JMenuItem RGBtoGrayMenuItem=new JMenuItem("灰度图像转换");
operateMenu.add(RGBtoGrayMenuItem);
RGBtoGrayMenuItem.addActionListener(new RGBtoGrayActionListener());

JMenuItem balanceMenuItem=new JMenuItem("均衡化");
operateMenu.add(balanceMenuItem);
balanceMenuItem.addActionListener(new BalanceActionListener());

JMenuItem blackMenuItem=new JMenuItem("黑色");
operateMenu.add(blackMenuItem);
balanceMenuItem.addActionListener(new BlackActionListener());

JMenuItem whiteMenuItem=new JMenuItem("白色");
operateMenu.add(whiteMenuItem);
balanceMenuItem.addActionListener(new WhiteActionListener());

JMenuItem fsMenuItem=new JMenuItem("腐蚀");
operateMenu.add(fsMenuItem);
fsMenuItem.addActionListener(new fsActionListener());

JMenuItem ksMenuItem=new JMenuItem("扩散");
operateMenu.add(ksMenuItem);
ksMenuItem.addActionListener(new ksActionListener());

JMenu frontAndBackMenu=new JMenu("历史操作");
jb.add(frontAndBackMenu);

JMenuItem backMenuItem=new JMenuItem("后退");
frontAndBackMenu.add(backMenuItem);
backMenuItem.addActionListener(new BackActionListener());

JMenuItem frontMenuItem=new JMenuItem("前进");
frontAndBackMenu.add(frontMenuItem);
frontMenuItem.addActionListener(new FrontActionListener());

this.setJMenuBar(jb);

imageLabel=new JLabel("");
JScrollPane pane = new JScrollPane(imageLabel);
this.add(pane,BorderLayout.CENTER);

this.setVisible(true);

}

private class OpenListener implements ActionListener{
public void actionPerformed(ActionEvent e){
JFileChooser jc=new JFileChooser();
int returnValue=jc.showOpenDialog(null);
if (returnValue == JFileChooser.APPROVE_OPTION) {
File selectedFile = jc.getSelectedFile();
if (selectedFile != null) {
fileString=selectedFile.getAbsolutePath();
try{
newImage =ImageIO.read(new File(fileString));
w=newImage.getWidth();
h=newImage.getHeight();
currentPixArray=getPixArray(newImage,w,h);
imageStack.clear();
tempImageStack.clear();
imageStack.addLast(currentPixArray);
imageLabel.setIcon(new ImageIcon(newImage));

}catch(IOException ex){
System.out.println(ex);
}

}
}
ColorPaint.this.repaint();
//MyShowImage.this.pack();
}
}

//////////////////菜单监听器///////////////////////
private class RGBtoGrayActionListener implements ActionListener{

public void actionPerformed(ActionEvent e){
int[] resultArray=RGBtoGray(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}

}

private class BlackActionListener implements ActionListener{

public void actionPerformed(ActionEvent e){

int[] resultArray=black();
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}

}

private class WhiteActionListener implements ActionListener{

public void actionPerformed(ActionEvent e){
int[] resultArray=balance(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}

}
private class fsActionListener implements ActionListener{

public void actionPerformed(ActionEvent e){
int[] resultArray=RGBIron(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}

}
private class ksActionListener implements ActionListener{

public void actionPerformed(ActionEvent e){
int[] resultArray=extend(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}

}
private class BalanceActionListener implements ActionListener{

public void actionPerformed(ActionEvent e){
int[] resultArray=balance(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray=resultArray;
showImage(resultArray);
tempImageStack.clear();
}

}

private class BackActionListener implements ActionListener{

public void actionPerformed(ActionEvent e){
if(imageStack.size()<=1){
JOptionPane.showMessageDialog(null,"此幅图片的处理已经没有后退历史操作了","提示",
JOptionPane.INFORMATION_MESSAGE);
}else{
tempImageStack.addLast(imageStack.removeLast());
currentPixArray=imageStack.getLast();
showImage(currentPixArray);
}
}

}

private class FrontActionListener implements ActionListener{

public void actionPerformed(ActionEvent e){
if(tempImageStack.size()<1){
JOptionPane.showMessageDialog(null,"此幅图片的处理已经没有前进历史操作了","提示",
JOptionPane.INFORMATION_MESSAGE);
}else{
currentPixArray=tempImageStack.removeFirst();
imageStack.addLast(currentPixArray);
showImage(currentPixArray);
}
}

}

//////////////////获取图像像素矩阵///////////////////
private int[]getPixArray(Image im,int w,int h){
int[] pix=new int[w*h];
PixelGrabber pg=null;
try{
pg = new PixelGrabber(im, 0, 0, w, h, pix, 0, w);
if(pg.grabPixels()!=true)
try{
throw new java.awt.AWTException("pg error"+pg.status());
}catch(Exception eq){
eq.printStackTrace();
}
} catch(Exception ex){
ex.printStackTrace();

}

return pix;
}

//////////////////显示图片///////////////////////
private void showImage(int[] srcPixArray){
Image pic=createImage(new MemoryImageSource(w,h,srcPixArray,0,w));
ImageIcon ic=new ImageIcon(pic);
imageLabel.setIcon(ic);
imageLabel.repaint();
}

//////////////////灰度转换///////////////////////
private int[] RGBtoGray(int[] ImageSource){
int[]grayArray=new int[h*w];
ColorModel colorModel=ColorModel.getRGBdefault();
int i ,j,k,r,g,b;
for(i = 0; i < h;i++){
for(j = 0;j < w;j++){
k = i*w+j;

r = colorModel.getRed(ImageSource[k]);
g = colorModel.getGreen(ImageSource[k]);
b = colorModel.getBlue(ImageSource[k]);

// System.out.println(ImageSource[k]);
//System.out.println(ImageSource[k]&0xff);
// System.out.println(r+" "+g+" "+b);

int gray=(int)(r*0.3+g*0.59+b*0.11);
r=g=b=gray;

grayArray[i*w+j]=(255 << 24) | (r << 16) | (g << 8 )| b;

// System.out.println(grayArray[i*w+j]);
}
}
return grayArray;
}
//////////////////图像腐蚀///////////////////////
private int[] RGBIron(int[] ImageSource){
int[]grayArray=new int[h*w];
ColorModel colorModel=ColorModel.getRGBdefault();

int i ,j,k1,k2,k3,k4,k5,k6,k7,k8,r,g,b;
for(i = 1; i < h-1;i++){
for(j = 1;j < w-1;j++){

k1 = (i-1)*w+j-1;
k2 = (i-1)*w+j;
k3 = (i-1)*w+j+1;
k4 = i*w+j-1;
k5 = i*w+j+1;
k6 = (i+1)*w+j-1;
k7 =(i+1)*w+j;
k8 =(i+1)*w+j+1;
r =(int)((double)(colorModel.getRed(ImageSource[k1])+colorModel.getRed(ImageSource[k2])+
colorModel.getRed(ImageSource[k3])+colorModel.getRed(ImageSource[k4])+
colorModel.getRed(ImageSource[k5])+colorModel.getRed(ImageSource[k6])+
colorModel.getRed(ImageSource[k7])+colorModel.getRed(ImageSource[k8]))*0.125);
g =(int)((double)(colorModel.getGreen(ImageSource[k1])+colorModel.getGreen(ImageSource[k2])+
colorModel.getGreen(ImageSource[k3])+colorModel.getGreen(ImageSource[k4])+
colorModel.getGreen(ImageSource[k5])+colorModel.getGreen(ImageSource[k6])+
colorModel.getGreen(ImageSource[k7])+colorModel.getGreen(ImageSource[k8]))*0.125);
b= (int)((double)(colorModel.getBlue(ImageSource[k1])+colorModel.getBlue(ImageSource[k2])+
colorModel.getBlue(ImageSource[k3])+colorModel.getBlue(ImageSource[k4])+
colorModel.getBlue(ImageSource[k5])+colorModel.getBlue(ImageSource[k6])+
colorModel.getBlue(ImageSource[k7])+colorModel.getBlue(ImageSource[k8]))*0.125);

// System.out.println(ImageSource[k]);
// System.out.println("颜色分量值:"+r+" "+g+" "+b);
// System.out.println("值 "+(ImageSource[k]&0xff));

// System.out.println("alpha "+colorModel.getAlpha(ImageSource[k]));
//System.out.println("alpha "+ImageSource[k]);

grayArray[i*w+j]=(255 << 24) | (r << 16) | (g << 8 )| b;

// System.out.println(+grayArray[i*w+j]);
}
}

return grayArray;
}
private int[] extend(int[] ImageSource){
int[]grayArray=new int[h*w];
ColorModel colorModel=ColorModel.getRGBdefault();
int i ,j,k1,k2,k3,k4,k5,k6,k7,k8,r,g,b;
for(i = 1; i < h-1;i++){
for(j = 1;j < w-1;j++){

k1 = (i-1)*w+j-1;
k2 = (i-1)*w+j;
k3 = (i-1)*w+j+1;
k4 = i*w+j-1;
k5 = i*w+j+1;
k6 = (i+1)*w+j-1;
k7 =(i+1)*w+j;
k8 =(i+1)*w+j+1;
r = (colorModel.getRed(ImageSource[k1])+colorModel.getRed(ImageSource[k2])+
colorModel.getRed(ImageSource[k3])+colorModel.getRed(ImageSource[k4])+
colorModel.getRed(ImageSource[k5])+colorModel.getRed(ImageSource[k6])+
colorModel.getRed(ImageSource[k7])+colorModel.getRed(ImageSource[k8]))/8;
g = (colorModel.getGreen(ImageSource[k1])+colorModel.getGreen(ImageSource[k2])+
colorModel.getGreen(ImageSource[k3])+colorModel.getGreen(ImageSource[k4])+
colorModel.getGreen(ImageSource[k5])+colorModel.getGreen(ImageSource[k6])+
colorModel.getGreen(ImageSource[k7])+colorModel.getGreen(ImageSource[k8]))/8;
b= (colorModel.getBlue(ImageSource[k1])+colorModel.getBlue(ImageSource[k2])+
colorModel.getBlue(ImageSource[k3])+colorModel.getBlue(ImageSource[k4])+
colorModel.getBlue(ImageSource[k5])+colorModel.getBlue(ImageSource[k6])+
colorModel.getBlue(ImageSource[k7])+colorModel.getBlue(ImageSource[k8]))/8;
// r=255+r;
// g=255+g;
// b=255+b;
if(r>128)r=255-r;
if(g>128)g=255-g;
if(b>128)b=255-b;
// System.out.println(ImageSource[k]);
// System.out.println("颜色分量值:"+r+" "+g+" "+b);
// System.out.println("值 "+(ImageSource[k]&0xff));

// System.out.println("alpha "+colorModel.getAlpha(ImageSource[k]));
//System.out.println("alpha "+ImageSource[k]);

grayArray[i*w+j]=(255 << 24) | (r << 16) | (g << 8 )| b;

//System.out.println(+grayArray[i*w+j]);
}
}

return grayArray;
}
private int[] black(){
int[] dinPixArray=new int[w*h];
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
dinPixArray[i*w+j]=255<<24|255<<16|255<<8|255;;

}
}
return dinPixArray;
}

/////////////////图像均衡化//////////////////////
private int[] balance(int[] srcPixArray){
int[] dinPixArray=new int[w*h];
int sum=0;
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
int grey=srcPixArray[i*w+j]&0xff;
sum=sum+grey;
}
}
double avg=sum/(w*h);
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
if(avg>(srcPixArray[i*w+j]&0xff))
{
dinPixArray[i*w+j]=255<<24|0|0|0;
}

else
{
int hist=(srcPixArray[i*w+j]&0xff)-(int)avg;
dinPixArray[i*w+j]=255<<24|hist<<16|hist<<8|hist;
}

}
}
return dinPixArray;
}

public static void main(String[] args) {
new ColorPaint("ShowImage");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: