当前位置: 首页 > 面试题库 >

将short []转换为灰度图像

蒲坚
2023-03-14
问题内容

我正在使用aparapi编写Buddhabrot分形生成器。我将其中的OpenCL部分工作了,得到了一个表示每个像素的单维数组。我将最终图像的尺寸作为最终整数,并编写了代码以获取该数组中任意点的索引。我想将其另存为图像,并且尝试将BufferedImage与TYPE_USHORT_GRAY一起使用。这是我到目前为止的内容:

    BufferedImage image=new BufferedImage(VERTICAL_PIXELS, HORIZONTAL_PIXELS, BufferedImage.TYPE_USHORT_GRAY);
    for(int i=0; i<VERTICAL_PIXELS; i++)
        for(int k=0; k<HORIZONTAL_PIXELS; k++)
            image.setRGB(k, i, normalized[getArrayIndex(k,i,HORIZONTAL_PIXELS)]);

问题是,我不知道将RGB设置为什么。我需要做什么?


问题答案:

这里的问题是setRGB()想要0xRRGGBB颜色值。BufferedImage喜欢假装图像是RGB,无论数据是以什么形式存储的。实际上,您可以使用DataBufferShortgetTile(0, 0).getDataBuffer())来获取内部信息,但是弄清楚它的布局方式可能很棘手。

如果您已经有像素short[],则一个简单的解决方案可能是将像素复制到int[]而不是将其塞入MemoryImageSource

int[] buffer = /* pixels */;

ColorModel model = new ComponentColorModel(
   ColorSpace.getInstance(ColorSpace.CS_GRAY), new int[] { 16 }, 
   false, true, Transparency.OPAQUE, DataBuffer.TYPE_USHORT);

Image image = Toolkit.getDefaultToolkit().createImage(
   new MemoryImageSource(VERTICAL_PIXELS, HORIZONTAL_PIXELS, 
                         model, buffer, 0, VERTICAL_PIXELS));

这种方法的优点是您可以控制基础像素阵列。你可以更改该数组并调用newPixels()你的MemoryImageSource,它会实时更新。除了灰度以外,它还使您能够完全定义自己的调色板:

int[] cmap = new int[65536];
for(int i = 0; i < 65536; ++i) {

    cmap[i] = (((i % 10000) * 256 / 10000) << 16) 
            | (((i % 20000) * 256 / 20000) << 8)
            | (((i % 40000) * 256 / 40000) << 0);
}
ColorModel model = new IndexColorModel(16, 65536, cmap, 0, false, -1, DataBuffer.TYPE_USHORT);

如果您只想在屏幕上显示图像,则此方法效果很好:

JFrame frame = new JFrame();
frame.getContentPane().add(new JLabel(new ImageIcon(image)));
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

但是,如果您想将其写到文件中并保留每像素一个短的格式(例如,加载到Matlab中),那么您就不走运了。最好的办法是将其绘制为,BufferedImage然后用保存,ImageIO将另存为RGB。

如果最后肯定需要a BufferedImage,则另一种方法是自己应用调色板,计算RGB值,然后将它们复制到图像中:

short[] data = /* your data */;
int[] cmap = /* as above */;
int[] rgb = new int[data.length];

for(int i = i; i < rgb.length; ++i) {
   rgb[i] = cmap[data[i]];
}

BufferedImage image = new BufferedImage(
   VERTICAL_PIXELS, HORIZONTAL_PIXELS, 
   BufferedImage.TYPE_INT_RGB);

image.setRGB(0, 0, VERTICAL_PIXELS, HORIZONTAL_PIXELS,
   pixels, 0, VERTICAL_PIXELS);


 类似资料:
  • 问题内容: 我想将具有形状的灰度图像转换为具有形状的3通道图像。使用可以完成工作,但是必须有一个整洁的方法。这是程序中的一段代码,有人可以提示。请指教。 问题答案: 您可以使用它来更简洁地完成此操作:

  • 问题内容: 你好,我正在将图像从彩色转换为纯黑白,结果是深色图像。我没有原因。以下是我的代码,它受SO上其他代码的启发。任何指导都会有所帮助。 我没有弄错我在做什么。使用任何其他开放源代码库的任何其他想法都可以。 工作::::: 问题答案: 您实际上并没有将彩色图像转换为黑白图像。您正在创建与空白图片相同大小的新空白图片。您实际上需要做一些处理旧图像的操作。

  • 问题内容: 我有一个3,076,568个二进制值(1s和0s)的NumPy数组。我想将其转换为矩阵,然后在Python中转换为灰度图像。 但是,当我尝试将数组重塑为1,538,284 x 1,538,284矩阵时,出现内存错误。 如何减小矩阵的大小,以便将其变成适合屏幕显示的图像而又不丢失唯一性/数据? 此外,如何将其转换为灰度图像? 任何帮助或建议,将不胜感激。谢谢。 问题答案: 您的“二进制值

  • 我有一个关于将我的PNG图像更改为灰度的问题。我想做一个方法,接受byte[]图像作为参数,并作为byte[]返回新修改的灰度图像。 我发现了一些链接,使图像灰度与JPEG图像使用下面的片段。 我的参考资料在下面:我如何使用ImageJ作为单独的Java应用程序的库?https://www.mkyong.com/java/how-to-convert-byte-to-bufferedimage-i

  • 问题内容: 我试图用来读取RGB图像并将其转换为灰度。 在matlab中,我使用以下代码: 在matplotlib教程中,他们没有介绍。他们只是读了图像 然后将它们切成薄片,但这与根据我的理解将RGB转换为灰度不是同一回事。 我发现很难相信numpy或matplotlib没有将rgb转换为灰色的内置函数。这不是图像处理中的常见操作吗? 我写了一个非常简单的函数,可以在5分钟内使用导入的图像。这是非

  • 问题内容: 如何使用,或其他工具通过命令行将图像转换为黑白(灰度)? 问题答案: 如果已安装, 如果您不担心丢失原始文件:。