Java 模糊图像算法工作不正常

Java 模糊图像算法工作不正常,java,image,Java,Image,我已经实现了模糊算法。我不明白为什么它会产生蓝色,虽然原始图像不是蓝色的。我认为问题在于这里(所有颜色的总和) 整和=(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

我已经实现了模糊算法。我不明白为什么它会产生蓝色,虽然原始图像不是蓝色的。我认为问题在于这里(所有颜色的总和) 整和=(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();
}
}
公共类BlurImageDemo1{
BlurImageDemo1()引发IOException,InterruptedException{
文件f=新文件(“D:\\mk.jpg”);
BuffereImage im=ImageIO.read(f);
对于(int x=1;x


此处不应混合颜色通道,因此需要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));
//获取像素
颜色p1=新颜色(im.getRGB(y-1,x-1));
颜色p2=新颜色(im.getRGB(y,x-1));
颜色p3=新颜色(im.getRGB(y+1,x-1));
颜色p4=新颜色(im.getRGB(y-1,x));
颜色p5=新颜色(im.getRGB(y,x));
颜色p6=新颜色(im.getRGB(y+1,x));
颜色p7=新颜色(im.getRGB(y-1,x+1));
颜色p8=新颜色(im.getRGB(y,x+1));
颜色p9=新颜色(im.getRGB(y+1,x+1));
//分别模糊所有组件
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;
intB=(p1.getBlue()+p2.getBlue()+p3.getBlue()+
p4.getBlue()+p5.getBlue()+p6.getBlue()+
p7.getBlue()+p8.getBlue()+p9.getBlue())/9;
//回写结果

blurredim.setRGB(y,x,b+(g)你为什么要对通道进行求和?我不明白。你看到原始图像了吗?没有蓝色。这怎么可能。请解释一下,我觉得这个问题有点神秘,因为它看起来是有意为之。你把红绿色和蓝色加起来,导致亮度严重混合,然后模糊,然后假装亮度是RGB,这就是它不是,但当然大部分都是最低8位的-非常蓝。我只是在学习图像处理。我对颜色混合没有很好的理解。我也不是在假装什么。如果你能帮我的话,那就太好了。你能帮我更正代码吗。如果你用
getRGB()
?OMG中的int怎么办。你只用了一分钟就完成了。我这么做只是为了了解模糊是如何工作的。再次感谢你的帮助。@matt这样做会更快,但可能会让OP更困惑,因为所有的bitmath,所以我只是保留了一个建议。我很确定你可以使用getRGB返回的值,将其平均,然后使用setRGB,而无需任何处理单独使用组件。@matt不,你不能,组件会以奇怪的方式混合。例如,0xFFFFFF加上8个黑色像素除以9就是0x1c71c7,一种奇怪的蓝色。