我想反转和灰度图像。这是我的原图:
下面是我想要实现的最终结果(使用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));
如何改进上述代码?
3条答案
按热度按时间8dtrkrch1#
使用
Imgproc
以及Core
,我做到了更接近一些,虽然不完全相同:
j13ufse22#
虽然我不熟悉colorconvertop,但我怀疑它将彩色图像转换为灰度的方式与paint.net不同。没有正确的方法。
看看黄色的。黄色应该是深灰色还是浅灰色?看起来paint.net认为它是亮的,colorconvertop认为它是暗的。
试着通过平均红/绿/蓝来进行转换。
mwkjh3gx3#
标题上写着opencv,但是有一个boofcv的标签。下面是如何在boofcv中实现的: