Wrong brightness converting image to grayscale in Java

后端 未结 2 664
暗喜
暗喜 2021-01-21 00:19

I\'m converting a image to gray scale in Java with the following code:

BufferedImage originalImage = ImageIO.read(new File(\"/home/david/input.bmp\"));
BufferedI         


        
相关标签:
2条回答
  • 2021-01-21 00:41

    Finally I've wrote GrayscaleFilter class implementing BufferedImageOp interface.

    I've followed this really good guide about Java image processing.

    This is the relevant code fragment:

    public class GrayscaleFilter extends AbstractFilter
    {
        public final static double[] METHOD_AVERAGE = {1.0/3.0, 1.0/3.0, 1.0/3.0};
        public final static double[] METHOD_GIMP_LUMINOSITY = {0.21, 0.71, 0.07};
    
        public GrayscaleFilter(final double[] rgb)
        {
            this(rgb[0], rgb[1], rgb[2]);
        }
    
        public BufferedImage filter(BufferedImage src, BufferedImage dest)
        {
            if (src.getType() == BufferedImage.TYPE_BYTE_GRAY)
            {
                dest = src;
                return dest;
            }
    
            if (dest == null)
                dest = createCompatibleDestImage(src, null);
    
            final int width = src.getWidth();
            final int height = src.getHeight();
    
            int[] inPixels = new int[width * height];
            GraphicsUtilities.getPixels(src, 0, 0, width, height, inPixels);
            byte[] outPixels = doFilter(inPixels);
            GraphicsUtilities.setPixels(dest, 0, 0, width, height, outPixels);
            return dest;
        }
    
        private byte[] doFilter(int[] inputPixels)
        {
            int red, green, blue;
            int i = 0;
            byte[] outPixels = new byte[inputPixels.length];
    
            for(int pixel : inputPixels)
            {
                // Obtengo valores originales
                red   = (pixel >> 16) & 0xFF;
                green = (pixel >> 8) & 0xFF;
                blue  = pixel & 0xFF;
    
                // Calculo valores nuevos
                outPixels[i++] = (byte)(
                     red   * red_part   +
                     green * green_part +
                     blue  * blue_part
                );
            }
            return outPixels;
        }
    
        public BufferedImage createCompatibleDestImage(BufferedImage src, ColorModel destCM)
        {
            return new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
        }
    }
    
    0 讨论(0)
  • 2021-01-21 00:57

    Find out the conversion formula used by Gimp. It probably takes some human color perception into account, while the Java implementation is mathematical (R+G+B)/ 3.

    0 讨论(0)
提交回复
热议问题