如何在Java中改进反转+灰度运算符?

Ste*_*han 2 java opencv image-processing grayscale boofcv

我想反转和灰度图像.这是我原来的形象:
在此输入图像描述

这是我想要实现的最终结果(使用Paint.NET生成):
在此输入图像描述

但是使用在Internet上找到的一些(基本?)Java代码,我只能得到如下图: 在此输入图像描述

这是我使用的代码:

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));
Run Code Online (Sandbox Code Playgroud)

如何改进上述代码?

mtr*_*trw 5

使用ImgprocCore,我做到了

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);
Run Code Online (Sandbox Code Playgroud)

并得到更接近的东西,虽然不相同:

OpenCV默认灰度映射+按位反转