均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
public void jMean_ActionPerformed(ActionEvent e) {
if(flag_load){
//
// BufferedImage.TYPE_INT_RGB : 表示一个图像,该图像具有整数像素的 8 位 RGB 颜色
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;
// 就是把四个八位二进制数
// 255<<24:11111111变成111111110000...(24个0)
int rgb = 255<<24|meanRed<<16|meanGreen<<8|meanBlue;
grayImage.setRGB(j, i, rgb);
}
}
tmp = grayImage;
repaint();
}else{
JOptionPane.showMessageDialog(null, "先点击“装载图像”,3Q!","提示:",
JOptionPane.WARNING_MESSAGE);
}
}
具体细节 看我写的灰度图