gpt4 book ai didi

java - 在java中区分16位和8位灰度图像

转载 作者:行者123 更新时间:2023-11-30 01:46:36 38 4
gpt4 key购买 nike

我正在尝试读取 .png 灰度图像并将灰度值转换为双[][]数组。我需要将它们映射到 0 到 1 之间的值。

我使用 BufferedImage 并且尝试使用 img.getColorModel().getColorSpace().getType() 找出颜色深度,但返回了 TYPE_5CLR 或 TYPE_6CLR 通用组件颜色空间没有帮助。

目前我正在读取如下值:

BufferedImage img = null;
try {
img = ImageIO.read(new File(path));
} catch (IOException e) {
return null;
}

double[][] heightmap= new double[img.getWidth()][img.getHeight()];
WritableRaster raster = img.getRaster();
for(int i=0;i<heightmap.length;i++)
{
for(int j=0;j<heightmap[0].length;j++)
{
heightmap[i][j]=((double) raster.getSample(i,j,0))/65535.0;
}
}

如果是 8 位,65535 应该是 256,但我不知道什么时候。

最佳答案

我在评论中写道,您可以使用 ColorModel.getNormalizedComponents(...),但由于它使用 float 值并且不必要的复杂,它可能只是更容易实现这样的转换:

BufferedImage img;
try {
img = ImageIO.read(new File(path));
} catch (IOException e) {
return null;
}

double[][] heightmap = new double[img.getWidth()][img.getHeight()];

WritableRaster raster = img.getRaster();

// Component size should be 8 or 16, yielding maxValue 255 or 65535 respectively
double maxValue = (1 << img.getColorModel().getComponentSize(0)) - 1;

for(int x = 0; x < heightmap.length; x++) {
for(int y = 0; y < heightmap[0].length; y++) {
heightmap[x][y] = raster.getSample(x, y, 0) / maxValue;
}
}

return heightmap;

请注意,上述代码仅适用于灰度图像,但这似乎是您的输入。所有颜色分量的分量大小可能相同 (getComponentSize(0)),但 R、G 和 B(以及 A,如果有 alpha 分量)可能有单独的样本,并且代码只会获取第一个样本 (getSample(x, y, 0))。

PS:为了清楚起见,我重命名了您的变量 xy。如果交换高度图中的尺寸,并在内循环中循环 x(而不是 y),则很可能会获得更好的性能,因为数据局部性更好。

关于java - 在java中区分16位和8位灰度图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57710728/

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