📄 medianimage.java
字号:
//MedianImage.java
/*
程序说明:对图像进行中值滤波.
公式为:
程序修改:
最后修改时间:2008-11
作者:朱磊
*/
import java.applet.Applet;
import java.awt.*;
//import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
public class MedianImage extends Applet {
Image im;
Image tmp;
int iw;
int ih;
int[] pixels;
boolean flagLoad=false;
//构造方法
public MedianImage(Image im,boolean flag){
if(im==null)
{
JOptionPane.showMessageDialog(null,"请先打开一幅图片!",
"Alert",JOptionPane.WARNING_MESSAGE);
}
this.im = im;
this.iw = im.getWidth(null);
this.ih = im.getHeight(null);
pixels=new int [iw*ih];
// this.pixels=pixels;
this.flagLoad = flag;
try {
PixelGrabber pg = new PixelGrabber(im, 0, 0, iw, ih, pixels, 0, iw);
pg.grabPixels();
} catch (InterruptedException e3) {
e3.printStackTrace();
}
}
public Image jMeadianImage_ActionPerformed(){
if(flagLoad){
try{
PixelGrabber pg=new PixelGrabber(im,0,0,iw,ih,pixels,0,iw);
pg.grabPixels();
}catch (InterruptedException e3) {
e3.printStackTrace();
}
//对图像进行中值滤波,Alpha值保持不变
ColorModel cm=ColorModel.getRGBdefault();
for(int i=1;i<ih-1;i++)
{
for(int j=1;j<iw-1;j++)
{
int red,green,blue;
int alpha=cm.getAlpha(pixels[i*iw+j]);
int red2=cm.getRed(pixels[(i-1)*iw+j]);
int red4=cm.getRed(pixels[i*iw+j-1]);
int red5=cm.getRed(pixels[i*iw+j]);
int red6=cm.getRed(pixels[i*iw+j+1]);
int red8=cm.getRed(pixels[(i+1)*iw+j]);
//水平方向进行中值滤波
if(red4>=red5){
if(red5>=red6) {red=red5;}
else{
if(red4>=red6) {red=red6;}
else{red=red4;}
}}
else{
if(red4>red6) {red=red4;}
else{
if(red5>red6) {red=red6;}
else{red=red5;}
}}
int green2=cm.getGreen(pixels[(i-1)*iw+j]);
int green4=cm.getGreen(pixels[i*iw+j-1]);
int green5=cm.getGreen(pixels[i*iw+j]);
int green6=cm.getGreen(pixels[i*iw+j+1]);
int green8=cm.getGreen(pixels[(i+1)*iw+j]);
//水平方向进行中值滤波
if(green4>=green5){
if(green5>=green6) {green=green5;}
else{
if(green4>=green6) {green=green6;}
else{green=green4;}
}}
else{
if(green4>green6) {green=green4;}
else{
if(green5>green6) {green=green6;}
else{green=green5;}
}}
int blue2=cm.getBlue(pixels[(i-1)*iw+j]);
int blue4=cm.getBlue(pixels[i*iw+j-1]);
int blue5=cm.getBlue(pixels[i*iw+j]);
int blue6=cm.getBlue(pixels[i*iw+j+1]);
int blue8=cm.getBlue(pixels[(i+1)*iw+j]);
//水平方向进行中值滤波
if(blue4>=blue5){
if(blue5>=blue6) {blue=blue5;}
else{
if(blue4>=blue6) {blue=blue6;}
else{blue=blue4;}
}}
else{
if(blue4>blue6) {blue=blue4;}
else{
if(blue5>blue6) {blue=blue6;}
else{blue=blue5;}
}}
pixels[i*iw+j]=alpha<<24|red<<16|green<<8|blue;
}
}
//将数组中的象素产生一个图像
ImageProducer ip=new MemoryImageSource(iw,ih,pixels,0,iw);
tmp=createImage(ip);
flagLoad=true;
// repaint();
}else{
JOptionPane.showMessageDialog(null,"请先打开一幅图片!",
"Alert",JOptionPane.WARNING_MESSAGE);
}
return tmp;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -