2

我想反转和灰度图像。这是我的原始图像:
在此处输入图像描述

这是我想要实现的最终结果(使用 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));

如何改进上述代码?

4

3 回答 3

6

使用Imgprocand Core,我做到了

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);

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

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

于 2015-04-29T21:48:42.157 回答
4

在标题中它说 OpenCV,但有一个 BoofCV 的标签。所以这里是如何在 BoofCV 中做到这一点:

BufferedImage orig = UtilImageIO.loadImage("filename");
ImageUInt8 gray = ConvertBufferedImage.convertFrom(orig, (ImageUInt8) null);
ImageUInt8 inverted = new ImageUInt8(gray.width,gray.height);
GrayImageOps.invert(gray,255,inverted);

在此处输入图像描述

于 2015-05-17T16:17:04.857 回答
1

虽然我不熟悉 ColorConvertOp,但我怀疑它以与 Paint.NET 不同的方式将彩色图像转换为灰度。没有正确的方法。

看看黄色。黄色应该是深灰色还是浅灰色?看起来 Paint.NET 认为它很亮,而 ColorConvertOp 认为它很暗。

尝试通过平均红色/绿色/蓝色来自己进行转换。

(red+green+blue)/3
于 2015-04-28T14:32:00.470 回答