如何改进 Java 中的反转 + 灰度运算符?
How to improve invert + grayscale operator in Java?
我想对图像进行反转和灰度化。这是我的原始图片:
这是我想要达到的最终结果(使用 Paint.NET 生成):
但是使用一些(基本的?)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));
如何改进上面的代码?
虽然我不熟悉 ColorConvertOp,但我怀疑它以不同于 Paint.NET 的方式将彩色图像转换为灰度。没有正确的方法。
看看黄色。黄色应该是深灰色还是浅灰色?看起来 Paint.NET 认为它很亮,而 ColorConvertOp 认为它很暗。
尝试通过对 red/green/blue.
进行平均来自己进行转换
(red+green+blue)/3
使用 Imgproc
和 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,但有一个 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);
我想对图像进行反转和灰度化。这是我的原始图片:
这是我想要达到的最终结果(使用 Paint.NET 生成):
但是使用一些(基本的?)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));
如何改进上面的代码?
虽然我不熟悉 ColorConvertOp,但我怀疑它以不同于 Paint.NET 的方式将彩色图像转换为灰度。没有正确的方法。
看看黄色。黄色应该是深灰色还是浅灰色?看起来 Paint.NET 认为它很亮,而 ColorConvertOp 认为它很暗。
尝试通过对 red/green/blue.
进行平均来自己进行转换(red+green+blue)/3
使用 Imgproc
和 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,但有一个 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);