• Java图像处理


    要求实现简单的图像处理功能:
         (1)打开一副图像;
         (2)对打开的图像进行简单处理,至少包括两种操作,如均值滤波、直方图均衡化等;
         (3)对处理之后的图像进行保存;

    import java.awt.EventQueue;
    import java.awt.event.*;
    import java.io.*;
    import javax.swing.*;

    /**
     * A program for viewing images.
     * @version 1.22 2017-3-17
     * @author **
     */
    public class ImageViewer
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(new Runnable()
             {
                public void run()
                { 
                   JFrame frame = new ImageViewerFrame();
                   frame.setTitle("Image Processing");
                   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                   frame.setVisible(true);
                }
             });
       }
    }

    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.BufferedImage;
    import java.awt.image.ColorModel;
    import java.awt.image.PixelGrabber;
    import java.io.*;

    import javax.imageio.ImageIO;
    import javax.swing.*;

    class ImageViewerFrame extends JFrame
    {
       private JLabel label;
       private JFileChooser chooser;
       private static final int DEFAULT_WIDTH = 600;
       private static final int DEFAULT_HEIGHT = 480;
       String name = " ";
       Image im, tmp; 
       int i, iw, ih; 
       int[] pixels; 
       boolean flag_load = false;
       boolean flag_grey = false;

       public ImageViewerFrame()
       {
          setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

          // use a label to display the images
          label = new JLabel();
          add(label);

          // set up the file chooser
          chooser = new JFileChooser();
          chooser.setCurrentDirectory(new File("."));

          // set up the menu bar
          JMenuBar menuBar = new JMenuBar();
          setJMenuBar(menuBar);

          JMenu menu = new JMenu("File");
          menuBar.add(menu);
         

          JMenuItem openItem = new JMenuItem("Open");
          menu.add(openItem);
          openItem.addActionListener(new ActionListener()
          {
              public void actionPerformed(ActionEvent event)
              {
                   // show file chooser dialog
               int result = chooser.showOpenDialog(null);

                   // if file selected, set it as icon of the label
                  if (result == JFileChooser.APPROVE_OPTION)
                  {
                      name = chooser.getSelectedFile().getPath();
                      //label.setIcon(new ImageIcon(name));
                     
                      File inputFile = new File(name);
                     
                      if(name != " ")
                       flag_load = true;
                     
                   BufferedImage input = null;
        try {
         input = ImageIO.read(inputFile);
        } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        } 
                      iw = input.getWidth(); 
                      ih = input.getHeight(); 
                      pixels = new int[iw*ih]; 
                      im = input; 
                      tmp = input; 
                      flag_load = true; 
                      repaint(); 

                  }
              }
      
          });

          JMenuItem SaveItem = new JMenuItem("Save");
          menu.add(SaveItem);
          SaveItem.addActionListener(new ActionListener()
          {
             public void actionPerformed(ActionEvent e)
             {
              try { 
                     jSave_ActionPerformed(e); 
                 } catch (IOException e1) { 
                     e1.printStackTrace(); 
                 }
             }
          });
         
          JMenuItem SaveAsItem = new JMenuItem("Save As");
          menu.add(SaveAsItem);
          SaveAsItem.addActionListener(new ActionListener()
          {
             public void actionPerformed(ActionEvent e)
             {
              try { 
                     jSave_ActionPerformed1(e); 
                 } catch (IOException e1) { 
                     e1.printStackTrace(); 
                 }
             }
          });
         
          JMenuItem exitItem = new JMenuItem("Exit");
          menu.add(exitItem);
          exitItem.addActionListener(new ActionListener()
          {
              public void actionPerformed(ActionEvent event)
              {
                  System.exit(0);
              }
          });
         
          JMenu menu1 = new JMenu("Edit");
          menuBar.add(menu1);
          JMenuItem deal1 = new JMenuItem("均值滤波");
          menu1.add(deal1);
          deal1.addActionListener(new ActionListener()
          {
             public void actionPerformed(ActionEvent e)
             {
       jMean_ActionPerformed(e); 
             }
          });
         
          JMenuItem deal2 = new JMenuItem("直方图均衡化");
          menu1.add(deal2);
          deal2.addActionListener(new ActionListener()
          {
             public void actionPerformed(ActionEvent e)
             {
              try {
        jGrey_ActionPerformed(e);
       } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
       }
              jRun_ActionPerformed(e);
             }
          });
         
          JMenuItem deal3 = new JMenuItem("黑白");
          menu1.add(deal3);
          deal3.addActionListener(new ActionListener()
          {
             public void actionPerformed(ActionEvent e)
             {
              try {  
                        jGrey_ActionPerformed(e);  
                    } catch (IOException e1) {  
                        e1.printStackTrace();  
                    }
             }
          });
       }
       public void jMean_ActionPerformed(ActionEvent e) {     
        if(flag_load){ 
            try{ 
                PixelGrabber pg = new PixelGrabber(im,0,0,iw,ih,pixels,0,iw); 
                      pg.grabPixels(); 
                  }catch(InterruptedException e3){ 
                    e3.printStackTrace(); 
                  } 
                BufferedImage grayImage = new BufferedImage(iw, ih,  
                          BufferedImage.TYPE_INT_RGB); 
                 
                ColorModel cm = ColorModel.getRGBdefault(); 
                 
                for(int i=1;i<ih-1;i++){ 
                    for(int j=1;j<iw-1;j++){ 
                         
                        int red1 = cm.getRed(pixels[(i-1)*iw+j-1]); 
                        int red2 = cm.getRed(pixels[(i-1)*iw+j]); 
                        int red3 = cm.getRed(pixels[(i-1)*iw+j+1]); 
                        int red4 = cm.getRed(pixels[i*iw+j-1]); 
                        int red6 = cm.getRed(pixels[i*iw+j+1]); 
                        int red7 = cm.getRed(pixels[(i+1)*iw+j-1]); 
                        int red8 = cm.getRed(pixels[(i+1)*iw+j]); 
                        int red9 = cm.getRed(pixels[(i+1)*iw+j+1]); 
                        int meanRed = (red1+red2+red3+red4+red6+red7+red8+red9)/8; 
                         
                        int green1 = cm.getGreen(pixels[(i-1)*iw+j-1]); 
                        int green2 = cm.getGreen(pixels[(i-1)*iw+j]); 
                        int green3 = cm.getGreen(pixels[(i-1)*iw+j+1]); 
                        int green4 = cm.getGreen(pixels[i*iw+j-1]); 
                        int green6 = cm.getGreen(pixels[i*iw+j+1]);
                        int green7 = cm.getGreen(pixels[(i+1)*iw+j-1]); 
                        int green8 = cm.getGreen(pixels[(i+1)*iw+j]); 
                        int green9 = cm.getGreen(pixels[(i+1)*iw+j+1]); 
                        int meanGreen = (green1+green2+green3+green4+green6+green7+green8+green9)/8; 
                         
                        int blue1 = cm.getBlue(pixels[(i-1)*iw+j-1]); 
                        int blue2 = cm.getBlue(pixels[(i-1)*iw+j]); 
                        int blue3 = cm.getBlue(pixels[(i-1)*iw+j+1]); 
                        int blue4 = cm.getBlue(pixels[i*iw+j-1]); 
                        int blue6 = cm.getBlue(pixels[i*iw+j+1]); 
                        int blue7 = cm.getBlue(pixels[(i+1)*iw+j-1]); 
                     int blue8 = cm.getBlue(pixels[(i+1)*iw+j]); 
                        int blue9 = cm.getBlue(pixels[(i+1)*iw+j+1]); 
                        int meanBlue = (blue1+blue2+blue3+blue4+blue6+blue7+blue8+blue9)/8; 
                         
                        int rgb = 255<<24|meanRed<<16|meanGreen<<8|meanBlue;  
                        grayImage.setRGB(j, i, rgb); 
                    }    
                } 
                tmp = grayImage; 
                repaint(); 
             
            }else{ 
                JOptionPane.showMessageDialog(null, "请打开一张图片!","提示:", 
                        JOptionPane.WARNING_MESSAGE); 
                } 
        }
        public void jSave_ActionPerformed(ActionEvent e) throws IOException{
        if(flag_load)
        {

              BufferedImage bi = new BufferedImage(tmp.getWidth(null),tmp.getHeight(null), BufferedImage.TYPE_INT_RGB); 
             Graphics g = bi.getGraphics(); 
             g.drawImage(tmp,0, 0,null); 
             g.dispose(); 
                 
                File save_path=new File(name+"(1)"+".jpg"); 
                ImageIO.write(bi, "JPG", save_path); 
     
        }
        else
        { 
         JOptionPane.showMessageDialog(null, "请打开一张图片!","提示:",JOptionPane.WARNING_MESSAGE); 
        }
        }
        public void jSave_ActionPerformed1(ActionEvent e) throws IOException{
         if(flag_load)
         {
             int result = chooser.showOpenDialog(null);
             BufferedImage bi = new BufferedImage(tmp.getWidth(null),tmp.getHeight(null), BufferedImage.TYPE_INT_RGB); 
             Graphics g = bi.getGraphics(); 
             g.drawImage(tmp,0, 0,null); 
             g.dispose(); 
               
             String name1 = chooser.getSelectedFile().getPath();
             if (result == JFileChooser.APPROVE_OPTION)
                {
              
              File save_path=new File(name1); 
              ImageIO.write(bi, "JPG", save_path); 
                }
     
         }
         else
         { 
          JOptionPane.showMessageDialog(null, "请打开一张图片!","提示:",JOptionPane.WARNING_MESSAGE); 
         }
        }
       
        public void jRun_ActionPerformed(ActionEvent e){  
            if(flag_load&&flag_grey){  
                try{  
                    PixelGrabber pg = new PixelGrabber(tmp,0,0,iw,ih,pixels,0,iw);  
                    pg.grabPixels();  
                }catch(InterruptedException e3){  
                    e3.printStackTrace();  
            }  
            BufferedImage greyImage = new BufferedImage(iw, ih,   
                        BufferedImage.TYPE_BYTE_GRAY);  
            //获取图像的直方图  
            int[] histogram = new int[256];  
            for(int i=0; i<ih-1; i++){  
                for(int j=0; j<iw-1; 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(int i=1; i<256; i++){  
                c[i] = c[i-1]+(int)(a*histogram[i]);  
            }  
            for(int i=0; i<ih; i++){  
                for(int j=0; j<iw; j++){  
                    int grey = pixels[i*iw+j]&0x0000ff;  
                    int hist = (int)(c[grey]);  
                    pixels[i*iw+j] = 255<<24|hist<<16|hist<<8|hist;  
                    greyImage.setRGB(j, i, pixels[i*iw+j]);  
                }  
            }  
            tmp = greyImage;  
            flag_load = true;  
            repaint();  
            }else{     
            }  
        }
       
        public void jGrey_ActionPerformed(ActionEvent e) throws IOException{  
            if(flag_load){  
                File inputFile = new File(name);  
                BufferedImage input = ImageIO.read(inputFile);  
                iw = input.getWidth(this);  
                ih = input.getHeight(this);  
                pixels = new int[iw*ih];  
                  
                BufferedImage grayImage = new BufferedImage(iw, ih,   
                        BufferedImage.TYPE_BYTE_GRAY);  
                for(int i=0; i<iw; i++){  
                    for(int j=0; j<ih; j++){  
                        int rgb = input.getRGB(i, j);    
                        int grey = (int) (0.3*((rgb&0xff0000 )>>16)+0.59*((rgb&0xff00 )>>8)+0.11*((rgb&0xff)));   
                        rgb = 255<<24|grey<<16|grey<<8|grey;  
                        grayImage.setRGB(i, j, rgb);  
                    }  
                }  
                tmp = grayImage;  
                try{  
                    PixelGrabber pg = new PixelGrabber(tmp,0,0,iw,ih,pixels,0,iw);  
                    pg.grabPixels();  
                }catch(InterruptedException e3){  
                    e3.printStackTrace();  
            }  
                flag_grey = true;  
                repaint();  
                } else{  
                    JOptionPane.showMessageDialog(null, "请打开一张图片!","提示:",  
                            JOptionPane.WARNING_MESSAGE);  
                }  
        }

        public void paint(Graphics g){ 
            if(flag_load){
                g.drawImage(tmp,DEFAULT_WIDTH/8,DEFAULT_HEIGHT/6,this);  
            }else{} 
        }
    }

  • 相关阅读:
    正则表达式匹配中国区的电话号码
    落户
    存储过程与函数的区别转载
    asp.net页面从初始化到卸载事件顺序转
    .net连接Oracle数据库 常见问题
    sql触发器的类型
    (转) C++中extern “C”含义深层探索
    vmware 收缩越来越大的磁盘文件
    (转)一些常用的网站
    工具:P/Invoke Interop Assistant
  • 原文地址:https://www.cnblogs.com/beimengmuxi/p/6567562.html
Copyright © 2020-2023  润新知