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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值