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

Jam*_*bbs 8 java memory tiff image imagej

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

因此,有必要将非常大的图像导出到单个文件中.我发现这很麻烦,因为这些图像的大小可以从800 MB到多GB.只是将这个单个图像加载到内存中的任务具有挑战性,特别是在进行图像分析时.

我想知道,如果有可能在java中以块或逐行的方式写这个大的tiff图像.目前我的应用程序在小型(8 GB RAM)机器上的内存不足.

组成这些图像的当前方法是:

  1. 将像素值存储到BufferedImage使用a中WritableRaster

    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]);
        }
    }   
    
    Run Code Online (Sandbox Code Playgroud)
  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());  
    
    Run Code Online (Sandbox Code Playgroud)

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

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

稍后我将修改代码以支持导出极大的图像,如100k x 100k.现在我可以假设一块内存来存储初始像素值.

那么,将一部分tif图像写入磁盘的好方法是什么,这样我就可以支持写出核心图像,如100k x 100k图像.

我确实看到了这篇文章:使用Java中的ImageIO编写TIFF的平铺输出

但它只讨论了TIFF 6.0规范.但我会调查一下ImageOutputStreams.虽然Tif是野兽,但我可能会咬紧牙关并鼓励生物学家只出口感兴趣的区域.

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

WRITER: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

Jam*_*bbs 2

好的,我找到了一个很好的解决方案,可以用 Java 实现此目的。

感谢 @bdares 指出 BigTiff。

但与 FIJI 打包在一起的是,有一个实现 scifio 的 bioformats 小组。

他们提供了许多受支持的读取器/写入器,其中之一是 TiffReader/Writer

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

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

我已经编辑了我的原始帖子。谢谢大家的评论,它帮助我找到了正确的方向。