gpt4 book ai didi

Java - 如何编写非常大(20,000x20,000 像素或更大)的 tif 图像

转载 作者:IT王子 更新时间:2023-10-28 23:35:53 24 4
gpt4 key购买 nike

我正在处理非常大的 tif 图像,我将它们组合成一个大的单个图像。我有一个由我的同事创建的库,它生成图像金字塔并提供了一个非常方便的工具来可视化图像金字塔。该可视化工具非常适合在大图像上获取峰值并直观地识别兴趣点,但客户对这些大图像的图像分析更感兴趣。

因此,有必要将非常大的图像导出到单个文件中。考虑到这些图像的大小可以从 800 MB 到数 GB 不等,我觉得这很麻烦。仅将这张图片加载到内存中的任务就具有挑战性,尤其是在进行图片分析时。

我想知道,是否可以在 java 中以 block 或逐行的方式编写这个大的 tiff 图像。目前,我的应用程序在小型(8 GB RAM)机器上内存不足。

目前构成这些图像的方法是:

  1. 使用 WritableRaster

    将像素值存储到 BufferedImage
    short[][]pixels = ...
    BufferedImage image = new BufferedImage(width, height, type);
    WritableRaster = image.getRaster();
    for (int row = 0; row < height; row++)
    {
    for (int col = 0; col < width; col++)
    {
    raster.setSample(col, row, 0, pixel[row][col]);
    }
    }
  2. 然后将缓冲的图像写入磁盘。对于这一部分,我使用 ImageJ 将图像写为 tif。如果有更好的方法支持 16 位灰度 tif 图像,那我很乐意去看看

    // BufferedImage image; from above
    ...
    ImagePlus img = new ImagePlus();
    img.setImage(image);
    FileSaver fs = new FileSaver(img);
    fs.saveAsTiff(file.getAbsolutePath());

这种方法的问题是它对于 8GB RAM 的机器来说内存占用太大。

理想情况下,我希望只有一个 short[][]pixels。这主要是因为我需要计算一个平均混合函数,所以会有一些内存占用。同样在未来我将添加一个线性混合。 short[][]pixels 对于 20k x 20k 像素数据应该只占用大约 765 MB 的 RAM,我认为这目前是不可避免的,所以对于较大的图像,例如 100k x 100k 像素,我会希望生物学家不要导出这张图片,因为它会占用 18GB 的​​ RAM。

稍后我将修改代码以支持导出 100k x 100k 等超大图像。现在我可以假设一 block 内存来存储初始像素值。

那么,将 tif 图像的一部分写入磁盘的好方法是什么,以便我可以支持写入核心图像,例如 100k x 100k 图像。

我确实看到了这个帖子:Write tiled output of TIFF, using ImageIO in Java

但它只是讨论了 TIFF 6.0 规范。但我会研究 ImageOutputStreams。 Tif 是一头野兽,所以我可能会硬着头皮鼓励生物学家只导出感兴趣的区域。

编辑:找到了可行的解决方案:

作者: https://github.com/openmicroscopy/bioformats/blob/v4.4.8/components/scifio/src/loci/formats/out/TiffWriter.java

读者: https://github.com/openmicroscopy/bioformats/blob/v4.4.8/components/scifio/src/loci/formats/in/TiffReader.java

主组页面: https://github.com/openmicroscopy/bioformats

最佳答案

使用 SCIFIO项目中,我们正在推广 Bio-Formats 图像 I/O 框架,以针对一般科学成像,而不仅仅是显微镜和生命科学。 SCIFIO API 现在处于测试阶段,includes TIFF当然可以readwrite在瓷砖。在 SCIFIO mailing list 上对 API 和错误的反馈总是受欢迎的!

关于Java - 如何编写非常大(20,000x20,000 像素或更大)的 tif 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18986368/

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