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{}  
    }
}
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号