假设我有一个带有 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);

感谢您的任何帮助和建议!