【问题标题】:blur image algorithm is not working properly模糊图像算法无法正常工作
【发布时间】:2017-05-14 14:20:25
【问题描述】:

我已经实现了 blur 算法。我不明白 为什么 它会产生 蓝色 虽然原始图像是 not 蓝色。我认为问题出在此处(总和所有颜色) 整数总和 = (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();
}
}

【问题讨论】:

  • 你为什么要对频道求和?
  • 我不明白。你看到原图了吗。没有蓝色。怎么可能。请解释
  • 嗯,我觉得这个问题有点神秘,因为它看起来是故意的。您将红色绿色和蓝色相加,导致亮度混合严重,您将其模糊,然后您假装亮度是 RGB,但事实并非如此,但当然大部分亮度是最低 8 位 - 所以蓝色.
  • 我只是学习图像处理。我对颜色混合没有很好的理解。我没有假装什么。如果你能帮助我,那就太好了。
  • 你能帮我改正代码吗?

标签: java image


【解决方案1】:

颜色通道不应在这里混合,因此需要 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));

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

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

【讨论】:

  • 如果你使用来自getRGB()的int呢?
  • 天啊。 “你很棒”。您只需一分钟就完成了……我这样做只是为了了解模糊的工作原理。并再次感谢您的帮助..
  • @matt 那么它会更快,但由于所有的位数学,它可能会使 OP 更加困惑,所以我只是提出建议
  • 我很确定您可以只使用 getRGB 返回的值,对其进行平均,然后使用 setRGB,而无需单独处理组件。
  • @matt 不,你不能,这些组件会以奇怪的方式混合。例如,0xFFFFFF 加上 8 个黑色像素除以 9 就是 0x1c71c7,这是一种奇怪的蓝色。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2015-07-25
  • 2019-01-11
  • 2012-07-04
相关资源
最近更新 更多