中值滤波与均值滤波的实验效果比较 均值滤波器
含有椒盐噪声的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)均值滤波是求图像内部每个像素点的所有相邻(如八邻域)像素点的平均值,并将该平均值作为该像素点的值;而中值滤波
* <br> 是对图像内部每个像素点采用滑动窗口(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;
/**
* 构造函数
*/
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();
}
//均值滤波 响应事件
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);
}
}
// 中值滤波响应事件
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);
}
}
//保存文件响应事件
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);
}
}
//退出响应事件
if (et.getSource() == quitButtton) {
System.exit(0);
}
}
}
//绘图函数
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
更多阅读
浅析《黑鹰坠落》中三角洲部队与游骑兵的实力 黑鹰坠落
尽管Ranger的贱人中尉(这个中尉是由出演过卢修斯·马尔福的帅哥Jason Isaacs演的==|||要我说这部片子真强大,居然聚集了这么多强悍的人)说:“你们三角洲部队的人就像一群没规矩的牛仔,让我告诉你一些事情,中士,当我们距离敌人只有五码近的
资产减值损失与坏账准备的关系 坏账准备 减值准备
资产减值损失与坏账准备的关系一、债务重组在债务重组时,因债权人已对重组债权计提了坏账准备,导致债权人收到的现金大于重组债权账面价值,该部分差额,债权人要冲减资产减值损失。例,甲单位年末应收账款余额100万,按标准计提的坏账准备
刑法:刑事犯罪中连续犯与继续犯的区分
刑事犯罪中连续犯与继续犯的区分作者:卢铁亮 中国法制新闻网 2011-8-9 案例: 一、无业青年李某因好吃懒做,又想有钱花。某天其见一女儿独自走在偏僻的小巷子,遂持刀上前准备抢劫。其在该女子身上抢得一部手机和少数现
化妆品中乳液与面霜的区别? 面霜 乳液的区别
大多MM常常为是选择乳液和面霜而烦恼。有的人说使用乳液好,有的人说使用面霜好。那么乳液和面霜到底哪个好呢?乳液和面霜又有什么不同呢?乳液和面霜不同之处:外表形态不同。乳液是液体状的,面霜是膏状的。结构性质不同。乳液的质地比
CAD布局中模型空间与图纸空间的图形如何相互转换-CHSPACE? cadchspace
在模型空间绘制的图形会跟随视口比例改变,而图纸空间绘制的图形由于在视口之外,就不会受视口的影响。常规操作是在模型空间绘图,在图纸空间只插入图框相关的一些内容,但也有不少人会在布局空间进行标注甚至进行绘图。如果由于没有切换