在java中用灰度图像写入像素数据

时间:2013-11-27 14:22:21

标签: java image image-processing

我正在开发一个关于图像处理的项目,我必须填写破裂的绘画的数字化图像。我必须将彩色图像转换为灰度,在灰度图像的2D数组上执行一些计算并将其写回灰度图像。代码是:

BufferedImage colorImage=ImageIO.read(new File(strImagePath));

            BufferedImage image = new BufferedImage(colorImage.getWidth(),colorImage.getHeight(),BufferedImage.TYPE_BYTE_GRAY);
            Graphics g = image.getGraphics();
            g.drawImage(colorImage, 0, 0, null);
            g.dispose();

            ImageIO.write(image,"PNG",new File("Image.PNG"));

            BufferedImage imgOriginal=ImageIO.read(new File("Image.PNG"));

            int width=image.getWidth();
            int height=image.getHeight();

            BufferedImage im=new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY);

            int arrOriginal[][]=new int[height][width];


            for(int i=0;i<height;i++)
                for(int j=0;j<width;j++)
                    arrOriginal[i][j]=imgOriginal.getRGB(j,i)& 0xFF;

            for(int i=0;i<height;i++)
                for(int j=0;j<width;j++)
                    im.setRGB(j,i,arrOriginal[i][j]);

            ImageIO.write(im,"PNG",new File("Image1.PNG"));

但是输出图像非常暗,我没有得到原始图像(我还没有做任何更改)。

我认为setRGB()语句应该有一些变化,但我不知道是什么。

要回写图像,我也尝试过:

`

BufferedImage im = new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY);
 WritableRaster raster = im.getRaster();
 for(int i=0;i<height;i++)
     for(int j=0;j<width;j++)
         raster.setSample(j,i,0,arrOriginal[i][j]); 

`

但它也没有给我原始图像。

有人能为我提供这个问题的解决方案吗? 提前谢谢。

1 个答案:

答案 0 :(得分:4)

我对基于Java的图像处理一无所知,但我对图像处理的了解非常多,所以我会看看能否给你任何想法。如果我错了,请不要开枪 - 我只是在暗示一个想法。

在灰度图像中,红色,绿色和蓝色值都相同,即红色=绿色=蓝色。因此,当你调用getRGB并使用0xff执行AND时,你可能只得到蓝色组件,但这没关系,因为红色和绿色是相同的 - 因为它是灰度的。

我怀疑问题是当你把它写回去创建你的新输出图像时,你只是设置蓝色组件而不是红色和绿色 - 这应该是相同的。尝试回写

original pixel + (original pixel << 8 ) + (original pixel <<16)

这样您不仅可以设置蓝色,还可以设置红色和绿色组件。