均值滤波和中值滤波的java代码


均值滤波和中值滤波的内容非常基础,均值滤波相当于低通滤波,有将图像模糊化的趋势,对椒盐噪声基本无能为力。中值滤波的优点是可以很好的过滤掉椒盐噪声,缺点是易造成图像的不连续性。在下面的代码中,中值滤波主要通过冒泡算法来实现。 
含有椒盐噪声的lena彩色图像: 
 


均值滤波的效果如下,可以看出,椒盐噪声被处理成了小的气泡,同时图像变模糊: 
 


中值滤波的效果如下,可以看到,几乎完全去除了椒盐噪声。
 
 


Java代码   收藏代码
  1. package p01;  
  2.   
  3. import java.awt.*;  
  4. import java.awt.event.*;  
  5. import java.awt.image.*;  
  6. import java.io.File;  
  7. import java.io.IOException;  
  8.   
  9. import javax.imageio.ImageIO;  
  10. import javax.swing.*;  
  11.   
  12. public class colorfilter extends Frame{  
  13.     Image im, tmp;  
  14.     int i, iw, ih;  
  15.     int[] pixels;  
  16.     boolean flag_load = false;  
  17.       
  18.     public colorfilter(){      
  19.         this.setTitle("彩色图像均值中值滤波3*3");  
  20.         Panel pdown;  
  21.         Button load, mean, median, save, quit;   
  22.         addWindowListener(new WindowAdapter(){  
  23.             public void windowClosing(WindowEvent e){  
  24.                 System.exit(0);  
  25.             }  
  26.         });  
  27.           
  28.         pdown = new Panel();  
  29.         pdown.setBackground(Color.lightGray);  
  30.         //定义按钮  
  31.         load = new Button("装载图像");      
  32.         mean = new Button("均值滤波3*3");  
  33.         median = new Button("中值滤波3*3");  
  34.         save = new Button("保存");  
  35.         quit = new Button("退出");  
  36.           
  37.         this.add(pdown, BorderLayout.SOUTH);  
  38.         //添加按钮  
  39.         pdown.add(load);      
  40.         pdown.add(mean);  
  41.         pdown.add(median);  
  42.         pdown.add(save);  
  43.         pdown.add(quit);  
  44.         //按钮的动作程序  装载图像  
  45.         load.addActionListener(new ActionListener(){      
  46.             public void actionPerformed(ActionEvent e){  
  47.                 try {  
  48.                 jLoad_ActionPerformed(e);  
  49.                 } catch (IOException e1) {  
  50.                     e1.printStackTrace();  
  51.                 }  
  52.             }  
  53.         });  
  54.         //按钮的动作程序  均值滤波  
  55.         mean.addActionListener(new ActionListener(){      
  56.             public void actionPerformed(ActionEvent e){  
  57.                 jMean_ActionPerformed(e);  
  58.             }  
  59.         });  
  60.         //按钮的动作程序  中值滤波  
  61.         median.addActionListener(new ActionListener(){      
  62.             public void actionPerformed(ActionEvent e){  
  63.                 jMedian_ActionPerformed(e);  
  64.             }  
  65.         });  
  66.         //按钮的动作程序  保存  
  67.         save.addActionListener(new ActionListener(){      
  68.             public void actionPerformed(ActionEvent e){  
  69.                 try {  
  70.                 jSave_ActionPerformed(e);  
  71.                 } catch (IOException e1) {  
  72.                     e1.printStackTrace();  
  73.                 }  
  74.             }  
  75.         });  
  76.         //按钮的动作程序  退出  
  77.         quit.addActionListener(new ActionListener(){      
  78.             public void actionPerformed(ActionEvent e){  
  79.                 jQuit_ActionPerformed(e);  
  80.             }  
  81.         });  
  82.     }  
  83.   //按钮动作的实现  加载图像  
  84.     public void jLoad_ActionPerformed(ActionEvent e) throws IOException{      
  85.         File inputFile = new File("E:\\f2\\sc\\lena_zaosheng08.jpg");  
  86.         BufferedImage input = ImageIO.read(inputFile);  
  87.         iw = input.getWidth(this);  
  88.         ih = input.getHeight(this);  
  89.     pixels = new int[iw*ih];  
  90.     im = input;  
  91.     tmp = input;  
  92.         flag_load = true;  
  93.         repaint();  
  94.     }  
  95.   //按钮动作的实现 均值滤波    
  96.     public void jMean_ActionPerformed(ActionEvent e) {      
  97.         if(flag_load){  
  98.             try{  
  99.                   PixelGrabber pg = new PixelGrabber(im,0,0,iw,ih,pixels,0,iw);  
  100.                   pg.grabPixels();  
  101.               }catch(InterruptedException e3){  
  102.                 e3.printStackTrace();  
  103.               }  
  104.             BufferedImage grayImage = new BufferedImage(iw, ih,   
  105.                       BufferedImage.TYPE_INT_RGB);  
  106.               
  107.             ColorModel cm = ColorModel.getRGBdefault();  
  108.               
  109.             for(int i=1;i<ih-1;i++){  
  110.                 for(int j=1;j<iw-1;j++){  
  111.                       
  112.                     int red1 = cm.getRed(pixels[(i-1)*iw+j-1]);  
  113.                     int red2 = cm.getRed(pixels[(i-1)*iw+j]);  
  114.                     int red3 = cm.getRed(pixels[(i-1)*iw+j+1]);  
  115.                     int red4 = cm.getRed(pixels[i*iw+j-1]);  
  116.                     int red6 = cm.getRed(pixels[i*iw+j+1]);  
  117.                     int red7 = cm.getRed(pixels[(i+1)*iw+j-1]);  
  118.                     int red8 = cm.getRed(pixels[(i+1)*iw+j]);  
  119.                     int red9 = cm.getRed(pixels[(i+1)*iw+j+1]);  
  120.                     int meanRed = (red1+red2+red3+red4+red6+red7+red8+red9)/8;  
  121.                       
  122.                     int green1 = cm.getGreen(pixels[(i-1)*iw+j-1]);  
  123.                     int green2 = cm.getGreen(pixels[(i-1)*iw+j]);  
  124.                     int green3 = cm.getGreen(pixels[(i-1)*iw+j+1]);  
  125.                     int green4 = cm.getGreen(pixels[i*iw+j-1]);  
  126.                     int green6 = cm.getGreen(pixels[i*iw+j+1]);  
  127.                     int green7 = cm.getGreen(pixels[(i+1)*iw+j-1]);  
  128.                     int green8 = cm.getGreen(pixels[(i+1)*iw+j]);  
  129.                     int green9 = cm.getGreen(pixels[(i+1)*iw+j+1]);  
  130.                     int meanGreen = (green1+green2+green3+green4+green6+green7+green8+green9)/8;  
  131.                       
  132.                    int blue1 = cm.getBlue(pixels[(i-1)*iw+j-1]);  
  133.                     int blue2 = cm.getBlue(pixels[(i-1)*iw+j]);  
  134.                     int blue3 = cm.getBlue(pixels[(i-1)*iw+j+1]);  
  135.                     int blue4 = cm.getBlue(pixels[i*iw+j-1]);  
  136.                     int blue6 = cm.getBlue(pixels[i*iw+j+1]);  
  137.                     int blue7 = cm.getBlue(pixels[(i+1)*iw+j-1]);  
  138.                     int blue8 = cm.getBlue(pixels[(i+1)*iw+j]);  
  139.                     int blue9 = cm.getBlue(pixels[(i+1)*iw+j+1]);  
  140.                     int meanBlue = (blue1+blue2+blue3+blue4+blue6+blue7+blue8+blue9)/8;  
  141.                       
  142.                     int rgb = 255<<24|meanRed<<16|meanGreen<<8|meanBlue;   
  143.                     grayImage.setRGB(j, i, rgb);  
  144.                 }     
  145.             }  
  146.             tmp = grayImage;  
  147.             repaint();  
  148.           
  149.         }else{  
  150.             JOptionPane.showMessageDialog(null"先点击“装载图像”,3Q!","提示:",  
  151.                     JOptionPane.WARNING_MESSAGE);  
  152.             }  
  153.     }  
  154.   //按钮动作的实现 中值滤波    
  155.     public void jMedian_ActionPerformed(ActionEvent e) {      
  156.         if(flag_load){  
  157.             try{  
  158.                   PixelGrabber pg = new PixelGrabber(im,0,0,iw,ih,pixels,0,iw);  
  159.                   pg.grabPixels();  
  160.               }catch(InterruptedException e3){  
  161.                 e3.printStackTrace();  
  162.               }  
  163.             BufferedImage grayImage = new BufferedImage(iw, ih,   
  164.                       BufferedImage.TYPE_INT_RGB);  
  165.               
  166.             ColorModel cm = ColorModel.getRGBdefault();  
  167.               
  168.             int[] tpRed = new int[9];  
  169.             int[] tpGreen = new int[9];  
  170.             int[] tpBlue = new int[9];  
  171.               
  172.             for(int i=1;i<ih-1;i++){  
  173.                 for(int j=1;j<iw-1;j++){  
  174.                       
  175.                     tpRed[0] = cm.getRed(pixels[(i-1)*iw+j-1]);  
  176.                     tpRed[1] = cm.getRed(pixels[(i-1)*iw+j]);  
  177.                     tpRed[2] = cm.getRed(pixels[(i-1)*iw+j+1]);  
  178.                     tpRed[3] = cm.getRed(pixels[i*iw+j-1]);  
  179.                     tpRed[4] = cm.getRed(pixels[i*iw+j]);  
  180.                     tpRed[5] = cm.getRed(pixels[i*iw+j+1]);  
  181.                     tpRed[6] = cm.getRed(pixels[(i+1)*iw+j-1]);  
  182.                     tpRed[7] = cm.getRed(pixels[(i+1)*iw+j]);  
  183.                     tpRed[8] = cm.getRed(pixels[(i+1)*iw+j+1]);  
  184.                         for(int rj=0; rj<8; rj++){  
  185.                         for(int ri=0; ri<8-rj; ri++){  
  186.                             if(tpRed[ri]>tpRed[ri+1]){  
  187.                                 int Red_Temp = tpRed[ri];  
  188.                                 tpRed[ri] = tpRed[ri+1];  
  189.                                 tpRed[ri+1] = Red_Temp;  
  190.                             }  
  191.                         }  
  192.                     }  
  193.                     int medianRed = tpRed[4];  
  194.                       
  195.                     tpGreen[0] = cm.getGreen(pixels[(i-1)*iw+j-1]);  
  196.                     tpGreen[1] = cm.getGreen(pixels[(i-1)*iw+j]);  
  197.                     tpGreen[2] = cm.getGreen(pixels[(i-1)*iw+j+1]);  
  198.                     tpGreen[3] = cm.getGreen(pixels[i*iw+j-1]);  
  199.                     tpGreen[4] = cm.getGreen(pixels[i*iw+j]);  
  200.                     tpGreen[5] = cm.getGreen(pixels[i*iw+j+1]);  
  201.                     tpGreen[6] = cm.getGreen(pixels[(i+1)*iw+j-1]);  
  202.                     tpGreen[7] = cm.getGreen(pixels[(i+1)*iw+j]);  
  203.                     tpGreen[8] = cm.getGreen(pixels[(i+1)*iw+j+1]);  
  204.                     for(int rj=0; rj<8; rj++){  
  205.                         for(int ri=0; ri<8-rj; ri++){  
  206.                             if(tpGreen[ri]>tpGreen[ri+1]){  
  207.                                 int Green_Temp = tpGreen[ri];  
  208.                                 tpGreen[ri] = tpGreen[ri+1];  
  209.                                 tpGreen[ri+1] = Green_Temp;  
  210.                             }  
  211.                         }  
  212.                     }  
  213.                     int medianGreen = tpGreen[4];  
  214.                       
  215.                     tpBlue[0] = cm.getBlue(pixels[(i-1)*iw+j-1]);  
  216.                     tpBlue[1] = cm.getBlue(pixels[(i-1)*iw+j]);  
  217.                     tpBlue[2] = cm.getBlue(pixels[(i-1)*iw+j+1]);  
  218.                     tpBlue[3] = cm.getBlue(pixels[i*iw+j-1]);  
  219.                     tpBlue[4] = cm.getBlue(pixels[i*iw+j]);  
  220.                     tpBlue[5] = cm.getBlue(pixels[i*iw+j+1]);  
  221.                     tpBlue[6] = cm.getBlue(pixels[(i+1)*iw+j-1]);  
  222.                     tpBlue[7] = cm.getBlue(pixels[(i+1)*iw+j]);  
  223.                     tpBlue[8] = cm.getBlue(pixels[(i+1)*iw+j+1]);  
  224.                     for(int rj=0; rj<8; rj++){  
  225.                         for(int ri=0; ri<8-rj; ri++){  
  226.                             if(tpBlue[ri]>tpBlue[ri+1]){  
  227.                                 int Blue_Temp = tpBlue[ri];  
  228.                                 tpBlue[ri] = tpBlue[ri+1];  
  229.                                 tpBlue[ri+1] = Blue_Temp;  
  230.                             }  
  231.                         }  
  232.                     }  
  233.                     int medianBlue = tpBlue[4];  
  234.                       
  235.                     int rgb = 255<<24|medianRed<<16|medianGreen<<8|medianBlue;   
  236.                     grayImage.setRGB(j, i, rgb);  
  237.                 }     
  238.             }  
  239.             tmp = grayImage;  
  240.             repaint();  
  241.           
  242.         }else{  
  243.             JOptionPane.showMessageDialog(null"先点击“装载图像”,3Q!","提示:",  
  244.                     JOptionPane.WARNING_MESSAGE);  
  245.             }  
  246.     }  
  247.     //按钮动作的实现  save  
  248.     public void jSave_ActionPerformed(ActionEvent e) throws IOException{      
  249.         if(flag_load){  
  250.               
  251.             BufferedImage bi = new BufferedImage(tmp.getWidth(null),tmp.getHeight(null),   
  252.                     BufferedImage.TYPE_INT_RGB);  
  253.             Graphics g = bi.getGraphics();  
  254.             g.drawImage(tmp,00,null);  
  255.             g.dispose();  
  256.               
  257.             File save_path=new File("E:\\f2\\sc\\save.jpg");  
  258.             ImageIO.write(bi, "JPG", save_path);  
  259.   
  260.     }else{  
  261.         JOptionPane.showMessageDialog(null"先点击“装载图像”,3Q!","提示:",  
  262.                 JOptionPane.WARNING_MESSAGE);  
  263.         }  
  264.     }  
  265.     //按钮动作的实现  退出  
  266.     public void jQuit_ActionPerformed(ActionEvent e){  
  267.         System.exit(0);  
  268.     }  
  269.   //绘图函数  
  270.     public void paint(Graphics g){  
  271.         if(flag_load){  
  272.             g.drawImage(tmp,50,50,this);  
  273.         }else{}  
  274.     }  
  275.       
  276.     public static void main(String[] args) {  
  277.         colorfilter ti = new colorfilter();  
  278.         ti.setSize(1000,860);  
  279.         ti.setVisible(true);  
  280.     }  
  281. }  
  • 大小: 145.4 KB
  • 大小: 47.9 KB
  • 大小: 35.4 KB

http://hello-wangfeng.iteye.com/blog/1719909
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值