Search code examples
javaimagehsv

Convert an RGB image to gray_scale HSV in java


I want to convert a RGB image into HSV and return a gray_scale image, finally. I ve got the following code in order to read and convert my image:

    BufferedImage lum = new BufferedImage(original.getWidth(), original.getHeight(), original.getType());

    for(int i=0; i<original.getWidth(); i++) {
        for(int j=0; j<original.getHeight(); j++) {

            // Get pixels by R, G, B
            alpha = new Color(original.getRGB(i, j)).getAlpha();
            red = new Color(original.getRGB(i, j)).getRed();
            green = new Color(original.getRGB(i, j)).getGreen();
            blue = new Color(original.getRGB(i, j)).getBlue();

            float[] hsv = Color.RGBtoHSB(red, green, blue, null);
            int hue = (int) Math.round(360 * hsv[0]);

            red = (int) (0.21 * red + 0.71 * green + 0.07 * blue);
            // Return back to original format
            newPixel = colorToRGB(alpha, red, red, red);

            // Write pixels into image
            lum.setRGB(i, j, hue);

        }
    }

    return lum;

What have to do in order to return a hsv gray_scale image? Is the above the proper way to do so?


Solution

  • It is very easy with JavaCV [OpenCV wrapper for java]

    IplImage originalImage = cvLoadImage("path of input image", 1);
    IplImage grayImage = IplImage.create(originalImage.width(),originalImage.height(),  IPL_DEPTH_8U, 1);  
    cvCvtColor(originalImage, grayImage, CV_BGR2GRAY);
    cvSaveImage("path of output image", originalImage);
    

    or if you want to implement it in pure java , use the following code

    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageDecoder;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    import java.awt.color.ColorSpace;
    import java.io.*;
    import java.awt.image.*;
    import javax.imageio.ImageIO;
    

    public class GrayScale {

    public static void convertToGrayscale() throws Exception {
    
        JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(new FileInputStream(new      File("a.jpg")));
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(new   FileOutputStream("b.jpg"));
        BufferedImage sourceImg = decoder.decodeAsBufferedImage();
        BufferedImageOp op = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
        BufferedImage destImg = op.filter(sourceImg, null);
        encoder.encode(destImg);
        decoder = null;
        encoder = null;
    

    }

    public static void main(String[] args) throws Exception {
    
        GrayScale.convertToGrayscale();
    
    }
    

    }