模糊图像算法无法正常工作

时间:2017-04-09 17:16:36

标签: java image

我已经实现了 blur 算法。我不明白为什么它正在生成蓝色虽然原始图像不是蓝色。我认为问题在这里(总和所有颜色)                 int sum =(s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9)/ 9; 请帮我。我的代码中有什么问题吗?

public class BlurImageDemo1 {

BlurImageDemo1() throws IOException, InterruptedException {
    File f = new File("D:\\mk.jpg");
    BufferedImage im = ImageIO.read(f);
    for (int x = 1; x < im.getHeight() - 2; x++) {
        for (int y = 1; y < im.getWidth() - 2; y++) {
            Color p1 = new Color(im.getRGB(y - 1, x-1));
            int s1=p1.getRed()+p1.getGreen()+p1.getBlue() ;

            Color p2 = new Color(im.getRGB(y, x - 1));
            int s2=p2.getRed()+p2.getGreen()+p2.getBlue() ;

            Color p3 = new Color(im.getRGB(y + 1, x - 1));
            int s3=p3.getRed()+p3.getGreen()+p3.getBlue() ;

            Color p4 = new Color(im.getRGB(y - 1, x));
            int s4=p4.getRed()+p4.getGreen()+p4.getBlue() ;

            Color p5 = new Color(im.getRGB(y, x));
            int s5=p5.getRed()+p5.getGreen()+p5.getBlue();

            Color p6 = new Color(im.getRGB(y + 1, x));
            int s6=p6.getRed()+p6.getGreen()+p6.getBlue() ;

            Color p7 = new Color(im.getRGB(y - 1, x + 1));
            int s7=p7.getRed()+p7.getGreen()+p7.getBlue() ;

            Color p8 = new Color(im.getRGB(y, x + 1));
            int s8=p8.getRed()+p8.getGreen()+p8.getBlue() ;

            Color p9 = new Color(im.getRGB(y + 1, x + 1));
            int s9=p9.getRed()+p9.getGreen()+p9.getBlue() ;

            int sum = (s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9)/9;
            System.out.println(sum);
            im.setRGB(y, x,sum);


        }
        //System.out.println();
    }
    ImageIO.write(im, "jpg", new File("D:\\MK1.jpg"));
}

public static void main(String[] args) throws IOException, InterruptedException {
    new BlurImageDemo1();
}
}

This is the original image.

This is converted image.It should be blurred, I don't know why it is blue.

1 个答案:

答案 0 :(得分:0)

颜色通道不应该在这里混合,因此它需要3个单独的模糊。

// get the pixels
Color p1 = new Color(im.getRGB(y - 1, x-1));
Color p2 = new Color(im.getRGB(y, x - 1));
Color p3 = new Color(im.getRGB(y + 1, x - 1));
Color p4 = new Color(im.getRGB(y - 1, x));
Color p5 = new Color(im.getRGB(y, x));
Color p6 = new Color(im.getRGB(y + 1, x));
Color p7 = new Color(im.getRGB(y - 1, x + 1));
Color p8 = new Color(im.getRGB(y, x + 1));
Color p9 = new Color(im.getRGB(y + 1, x + 1));
// blur all components separately
int r = (p1.getRed() + p2.getRed() + p3.getRed() + 
         p4.getRed() + p5.getRed() + p6.getRed() + 
         p7.getRed() + p8.getRed() + p9.getRed()) / 9;
int g = (p1.getGreen() + p2.getGreen() + p3.getGreen() + 
         p4.getGreen() + p5.getGreen() + p6.getGreen() + 
         p7.getGreen() + p8.getGreen() + p9.getGreen()) / 9;
int b = (p1.getBlue() + p2.getBlue() + p3.getBlue() + 
         p4.getBlue() + p5.getBlue() + p6.getBlue() + 
         p7.getBlue() + p8.getBlue() + p9.getBlue()) / 9;
// write back result
blurredim.setRGB(y, x, b + (g << 8) + (r << 16));

请注意,将像素存储在 new 图像中非常重要,否则写入的像素会影响其右侧和底部像素的结果。

还有更好的模糊,不使用Color会更快,而只是用bitmath手动解构颜色,但我觉得这超出了问题的范围。