假设我有一个带有 ARGB
Channels 的 BufferedImage
. 我可以简单地将此图像转换为灰度图像
BufferedImage copy = new BufferedImage(image.getWidth(), image.getHeight(),
BufferedImage.TYPE_BYTE_GRAY);
Graphics g = copy.getGraphics().create();
g.drawImage(image, 0, 0, null);
g.dispose();
我知道有几种其他方法可以进行灰度转换,但是这个方法对我的程序很有用 . 我也可以(并且确实)通过这样做来增强图像的对比度:
RescaleOp op;
op = new RescaleOp(1.0f, darken, null);
op.filter(copy, copy);
op = new RescaleOp(brighten, 0.0f, null);
op.filter(copy, copy);
但是有一个问题 . 有时候我需要隔离我的图像中略微暗红色的部分,这些部分接近于略微明亮的区域,即具有高红色值的区域(例如黄色和紫色) . 我需要隔离这些红色区域 . 我怎样才能有效地做到这一点?
手动,我想要的东西
for each pixel p in original
new.p = grayscale(Math.max(Math.abs(p.red - p.green), Math.abs(p.red - p.blue)))
我可以使用内置过滤器等更有效地完成此操作吗?我不是在寻找一个精确的过滤器 - 只是帮助我解决这些红色区域的问题 . 这种代码让我觉得有一种有效的方法:这是用于生成质量较低的灰度图像,但速度非常快 .
ImageFilter filter = new GrayFilter(true, 50);
ImageProducer producer = new FilteredImageSource(colorImage.getSource(), filter);
Image mage = this.createImage(producer);
感谢您的任何帮助和建议!