javaopencvimage-processinggrayscaleboofcv

How to improve invert + grayscale operator in Java?


I want to invert and gray scale an image. Here is my original image:
enter image description here

Here is the final result I want to achieve (produced with Paint.NET):
enter image description here

However using some (basic?) Java code found on Internet, I only get the picture below: enter image description here

Here is the code I used:

private static final byte[] invertTable;

static {
    invertTable = new byte[256];
    for (int i = 0; i < 256; i++) {
        invertTable[i] = (byte) (255 - i);
    }
}

private static BufferedImage grayScale(BufferedImage source) {
    ColorConvertOp grayScale = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);

    return grayScale.filter(source,null);
}

private static BufferedImage invertImage(final BufferedImage src) {
    final int w = src.getWidth();

    final int h = src.getHeight();

    final BufferedImage dst = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);

    final BufferedImageOp invertOp = new LookupOp(new ByteLookupTable(0, invertTable), null);

    return invertOp.filter(src, dst);
}

// ...
BufferedImage sourceImage = ...
BufferedImage convertedImage = grayScale(invertImage(sourceImage));

How can I improve the above code?


Solution

  • Using Imgproc and Core, I did

    Mat src = new Mat();
    Mat gray = new Mat();
    src = Highgui.imread("...");
    Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
    Core.bitwise_not(gray, gray);
    Highgui.imwrite("...", gray);
    

    and got something closer, though not identical:

    OpenCV default grayscale mapping + bitwise invert