【问题标题】:How can I visualize a large file read in numpy memmap format?如何可视化以 numpy memmap 格式读取的大文件?
【发布时间】:2020-03-15 10:35:03
【问题描述】:

我正在尝试读取 czi 格式的图像,但是因为它们需要大量内存,所以我尝试在 memmap 文件中读取它们。

这是我使用的代码>

import czifile as czi
fileName = "Zimt3.czi"
# read file to binary
file = czi.CziFile(fileName)
imageArr = file.asarray(out="/media/my drive/Temp/temp.bin")

现在 imageArr 是 memmap 中维度为 (9,3,29584,68084,1) 的变量。这些是来自 Carl Zeiss 设备的高分辨率显微图像。

这是更多规格的屏幕截图。

我认为这意味着 imageArr 包含 9 张图片,尺寸为 (29584,68084,3) 但我无法提取这种 numpy 数组来可视化为图像。 你能帮我把memmap中的(9,3,29584,68084,1)转换成(29584,68084,3)图像吗?

【问题讨论】:

  • 当您使用不同的图像格式时,有时当您读取图像文件时,文件的尺寸大于 RBG 矩阵。在这些情况下,您可以在其他附加维度上进行平均。我在实验中做到了,发现效果很好。
  • 使用常规数组我会arr.squeeze().transpose(0,2,3,4) - 即删除尺寸 1 尺寸,并将尺寸 3 尺寸移动到末尾。但这会产生一个新数组;最初是一个视图,但几乎任何用途都需要一个副本。我不确定memmap 位置如何改变事物。您可以将此更改分别应用于 9 张图片。

标签: python numpy numpy-memmap


【解决方案1】:

它看起来像一个非常大的文件。如果你只是想可视化它,你可以使用 slideio python 包(http://slideio.com)。它利用内部图像金字塔。您可以以高分辨率读取部分图像或以低分辨率读取整个图像。下面的代码重新调整了图像的比例,使传递的光栅的宽度为 500 像素(计算高度以保持图像大小比例)。

import slideio
import matplotlib.pyplot as plt

slide = slideio.open_slidei(file_path="Zimt3.czi",driver_id="CZI")
scene = slide.get_scene(0)
block = scene.read_block(size=(500,0))

plt.imshow(scene.read_block())

请注意,matplotlib 可以显示具有 1 或 3 个通道的图像。一个 CZI 文件可以有任意数量的通道。在这种情况下,您必须选择要显示的频道:

block = scene.read_block(size=(500,0), channel_indices=[0,2,5])

可视化的另一个问题可能是您的文件是 3D 还是 4D 图像。在这种情况下,slideio 返回 3d 或 4d numpy 数组。 Matplotlib 无法显示 3d 或 4d 图像。您将需要寻找特定的可视化包或选择 z 切片和/或时间范围:

block = scene.read_block(size=(500,0), channel_indices=[0,2,5], slices=(0,1), frames=(1,2))

有关更多详细信息,请参阅包文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多