含有椒鹽噪聲的lena彩色圖像:
中值濾波的效果如下,可以看到,幾乎完全去除了椒鹽噪聲。
均值濾波的效果如下,可以看出,椒鹽噪聲被處理成了小的氣泡,同時圖像變模糊:
代碼如下:
/**
* 2013-1-24
*/
package Filter;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
/**
* 彩色圖像的中值濾波和均值濾波
* @ClassName: MediaANDAveragefilter
* @Description: 目的在于比較均值濾波和中值濾波的性能。
* <p> 說明:
* <br> 1)均值濾波是求圖像內(nèi)部每個像素點的所有相鄰(如八鄰域)像素點的平均值,并將該平均值作為該像素點的值;而中值濾波
* <br> 是對圖像內(nèi)部每個像素點采用滑動窗口(3*3或5*5)進行鄰域搜索,并按照從小到大的順序排序,然后去中間的值(即中值)
* <br> 作為該像素點的像素值。
* <br> 2)均值濾波對噪聲具有擬制作用,但同時也會使圖像變得模糊;而中值濾波用于消除椒鹽噪聲,但同時不會使邊界變模糊。
* <br> 3)均值濾波對于擬制高斯噪聲的效果比較好,中值濾波對于椒鹽噪聲的擬制效果比較好;
* @author: TYLR2012
* @Version: V1.0
* @Date: 2013-1-24 下午4:24:25
*/
public class MediaANDAveragefilter extends Frame{
/**
*
*/
private static final long serialVersionUID = 1L;
private BufferedImage inputImage =null;
private BufferedImage dstImage =null;
private int Image_Width, Image_Height;
private int[] pixels;
private boolean flag_load = false;
private Button loadButtton;
private Button meanButtton;
private Button medianButtton;
private Button saveButtton;
private Button quitButtton;
private Panel pdown;
/**
* 構(gòu)造函數(shù)
*/
public MediaANDAveragefilter(){
setTitle("彩色圖像均值中值濾波");
setSize(600,600);
setVisible(true);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0); // 釋放主界面時,中斷JVM
}
});
// 界面布局
pdown = new Panel();
pdown.setBackground(Color.lightGray);
this.add(pdown, BorderLayout.SOUTH);
//定義按鈕
loadButtton = new Button("裝載圖像");
pdown.add(loadButtton);
loadButtton.addActionListener(new buttonActionListener());
meanButtton = new Button("均值濾波3*3");
pdown.add(meanButtton);
meanButtton.addActionListener(new buttonActionListener());
medianButtton = new Button("中值濾波3*3");
pdown.add(medianButtton);
medianButtton.addActionListener(new buttonActionListener());
saveButtton = new Button("保存");
pdown.add(saveButtton);
saveButtton.addActionListener(new buttonActionListener());
quitButtton = new Button("退出");
pdown.add(quitButtton);
quitButtton.addActionListener(new buttonActionListener());
}
public class buttonActionListener implements ActionListener{
public void actionPerformed(ActionEvent et) {
if (et.getSource() == loadButtton) {
File inputFile = new File("./ImageProcessingAlogrithm/Filter/源圖像.jpg");
try {
inputImage = ImageIO.read(inputFile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
dstImage = inputImage;
Image_Width = inputImage.getWidth();
Image_Height = inputImage.getHeight();
pixels = new int[Image_Width*Image_Height];
flag_load = true;
repaint();
}
//均值濾波 響應(yīng)事件
if (et.getSource() == meanButtton ) {
if(flag_load){
try{
PixelGrabber pg = new PixelGrabber(inputImage,0,0,Image_Width,Image_Height,pixels,0,Image_Width);
pg.grabPixels();
}catch(InterruptedException e3){
e3.printStackTrace();
}
BufferedImage grayImage = new BufferedImage(Image_Width, Image_Height,
BufferedImage.TYPE_INT_RGB);
ColorModel cm = ColorModel.getRGBdefault();
for(int i=1;i<Image_Height-1;i++){
for(int j=1;j<Image_Width-1;j++){
int sum_Red = 0, sum_Green = 0,sum_Blue = 0;
int mean_Red = 0,mean_Green = 0,mean_Blue = 0;
for(int k=-1;k<2;k++){
for(int l=-1;l<2;l++){
sum_Red += cm.getRed(pixels[(i+k)*Image_Width+j+l]);
sum_Green += cm.getGreen(pixels[(i+k)*Image_Width+j+l]);
sum_Blue += cm.getBlue(pixels[(i+k)*Image_Width+j+l]);
}
}
mean_Red = sum_Red/9;
mean_Green = sum_Green/8;
mean_Blue = sum_Blue/9;
int rgbValue = 255<<24|mean_Red<<16|mean_Green<<8|mean_Blue;
grayImage.setRGB(j, i, rgbValue);
}
}
dstImage = grayImage;
repaint();
}else{
JOptionPane.showMessageDialog(null, "先點擊“裝載圖像”,3Q!","提示:",
JOptionPane.WARNING_MESSAGE);

}
}
// 中值濾波響應(yīng)事件
if (et.getSource() == medianButtton ) {
if(flag_load){
try{
PixelGrabber pg = new PixelGrabber(inputImage,0,0,Image_Width,Image_Height,pixels,0,Image_Width);
pg.grabPixels();
}catch(InterruptedException e3){
e3.printStackTrace();
}
BufferedImage grayImage = new BufferedImage(Image_Width, Image_Height,
BufferedImage.TYPE_INT_RGB);
ColorModel cm = ColorModel.getRGBdefault();
int[] tpRed = new int[9];
int[] tpGreen = new int[9];
int[] tpBlue = new int[9];
int media_Red,media_Green,media_Blue;
for(int i=1;i<Image_Height-1;i++){
for(int j=1;j<Image_Width-1;j++){
int m = 0;
for(int k=-1;k<2;k++){
for(int l=-1;l<2;l++){
tpRed[m] = cm.getRed(pixels[(i+k)*Image_Width+j+l]);
tpGreen[m] = cm.getGreen(pixels[(i+k)*Image_Width+j+l]);
tpBlue[m] = cm.getBlue(pixels[(i+k)*Image_Width+j+l]);
m++;
}
}
// 對像素點(i*Image_Width+j)八鄰域中的所有像素點的redValue排序并求出中值;
for(int rj=0; rj<8; rj++){
for(int ri=0; ri<8-rj; ri++){
if(tpRed[ri]>tpRed[ri+1]){
int Red_Temp = tpRed[ri];
tpRed[ri] = tpRed[ri+1];
tpRed[ri+1] = Red_Temp;
}
}
}
media_Red = tpRed[4];
// 對像素點(i*Image_Width+j)八鄰域中的所有像素點的GreenValue 排序并求出中值;
for(int rj=0; rj<8; rj++){
for(int ri=0; ri<8-rj; ri++){
if(tpGreen[ri]>tpGreen[ri+1]){
int Green_Temp = tpGreen[ri];
tpGreen[ri] = tpGreen[ri+1];
tpGreen[ri+1] = Green_Temp;
}
}
}
media_Green= tpGreen[4];
// 對像素點(i*Image_Width+j)八鄰域中的所有像素點的BlueValue排序并求出中值;
for(int rj=0; rj<8; rj++){
for(int ri=0; ri<8-rj; ri++){
if(tpBlue[ri]>tpBlue[ri+1]){
int Blue_Temp = tpBlue[ri];
tpBlue[ri] = tpBlue[ri+1];
tpBlue[ri+1] = Blue_Temp;
}
}
}
media_Blue = tpBlue[4];
int rgb = 255<<24|media_Red<<16|media_Green<<8|media_Blue;
grayImage.setRGB(j, i, rgb);
}
}
dstImage = grayImage;
repaint();
}else{
JOptionPane.showMessageDialog(null, "先點擊“裝載圖像”,3Q!","提示:",
JOptionPane.WARNING_MESSAGE);
}
}
//保存文件響應(yīng)事件
if (et.getSource() == saveButtton) {
if(flag_load){
JFileChooser fileChooser = new JFileChooser(); //實例化文件選擇器
int saveValue=fileChooser.showSaveDialog(null);
if(saveValue==JFileChooser.APPROVE_OPTION){
File file=fileChooser.getSelectedFile(); //獲取保存路徑;
String format = "jpg";
try{
ImageIO.write(dstImage, format,file );
}catch(IOException ex){
ex.printStackTrace();
}
}
}else{
JOptionPane.showMessageDialog(null, "先點擊“裝載圖像”,3Q!","提示:",
JOptionPane.WARNING_MESSAGE);
}
}
//退出響應(yīng)事件
if (et.getSource() == quitButtton) {
System.exit(0);
}
}
}
//繪圖函數(shù)
public void paint(Graphics g){
if(flag_load){
g.drawImage(dstImage,50,50,this);
}else{}
}
public static void main(String[] args) {
MediaANDAveragefilter ti = new MediaANDAveragefilter();
}
}
原文來自:http://hello-wangfeng.iteye.com/blog/1719909
愛華網(wǎng)



