gpt4 book ai didi

java - 错误的亮度将图像转换为 Java 中的灰度

转载 作者:行者123 更新时间:2023-11-30 05:55:27 26 4
gpt4 key购买 nike

我正在使用以下代码在 Java 中将图像转换为灰度:

BufferedImage originalImage = ImageIO.read(new File("/home/david/input.bmp"));
BufferedImage grayImage = new BufferedImage(originalImage.getWidth()
, originalImage.getHeight()
, BufferedImage.TYPE_BYTE_GRAY);

ColorSpace gray = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp colorConvert = new ColorConvertOp(gray, null);
colorConvert.filter(originalImage, grayImage);

ImageIO.write(grayImage, "bmp", new File("/home/david/output_java.bmp"));

这似乎可行,但问题是输出图像与 gimp 生成的灰度图像有很大不同(参见下面的示例)。

  1. 我能否以某种方式控制图像的生成方式?
  2. 如何使结果更类似于 gimp 结果?

原图:

Color original image

Java生成的灰度图:

Gray scale image generated by ColorConvertOp

在 Gimp 中生成的灰度图像(Image -> Mode -> Grayscale):

Gray scale image generated in Gimp

顺便说一句:我有一堆来自 ffmpeg 的图像(带有灰色选项),它们就像 Gimp 图像,因此我想要那样的图像。

最佳答案

最后,我编写了实现 BufferedImageOp 接口(interface)的 GrayscaleFilter 类。

我关注了this really good关于 Java 图像处理的指南。

这是相关的代码片段:

public class GrayscaleFilter extends AbstractFilter
{
public final static double[] METHOD_AVERAGE = {1.0/3.0, 1.0/3.0, 1.0/3.0};
public final static double[] METHOD_GIMP_LUMINOSITY = {0.21, 0.71, 0.07};

public GrayscaleFilter(final double[] rgb)
{
this(rgb[0], rgb[1], rgb[2]);
}

public BufferedImage filter(BufferedImage src, BufferedImage dest)
{
if (src.getType() == BufferedImage.TYPE_BYTE_GRAY)
{
dest = src;
return dest;
}

if (dest == null)
dest = createCompatibleDestImage(src, null);

final int width = src.getWidth();
final int height = src.getHeight();

int[] inPixels = new int[width * height];
GraphicsUtilities.getPixels(src, 0, 0, width, height, inPixels);
byte[] outPixels = doFilter(inPixels);
GraphicsUtilities.setPixels(dest, 0, 0, width, height, outPixels);
return dest;
}

private byte[] doFilter(int[] inputPixels)
{
int red, green, blue;
int i = 0;
byte[] outPixels = new byte[inputPixels.length];

for(int pixel : inputPixels)
{
// Obtengo valores originales
red = (pixel >> 16) & 0xFF;
green = (pixel >> 8) & 0xFF;
blue = pixel & 0xFF;

// Calculo valores nuevos
outPixels[i++] = (byte)(
red * red_part +
green * green_part +
blue * blue_part
);
}
return outPixels;
}

public BufferedImage createCompatibleDestImage(BufferedImage src, ColorModel destCM)
{
return new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
}
}

关于java - 错误的亮度将图像转换为 Java 中的灰度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8281094/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com