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

来源:互联网 发布:大数据分析 职业规划 编辑:程序博客网 时间:2024/05/18 02:57

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");}}