如何在 Julia 中导入整数 tif 文件

How to import a integer tif file in Julia

我有一个 tif 图像,其中它的像素是整数。我想将它导入 Julia 并进一步处理。 我在 IJulia 中使用:

using FileIO
using Images
using ImageView
path_seed = joinpath(@__DIR__,"seed.tif")
seed = load(path_seed);

当我输入 seed 并输入时,我将在需要元素矩阵时获得图像。 如果我使用:

mat = convert(Array{Float32}, seed)

我会得到一个矩阵,但是有两个问题:

1-它的条目都是浮点数而不是整数。

2-浮点数的值与我期望的整数值不对应。例如,在我的图像中有值 0、1、2、3、4(图像是一个掩码,每个连接的组件的值为 0、1、2、3、4)但我得到浮点数 0.0、0.011764707、0.015686275 , 0.007843138, 0.003921569.

如何将图像导入为整数矩阵?这是示例图片:

http://s000.tinyupload.com/index.php?file_id=21432720633236092551

加载该文件时,您会看到 JuliaImages 的两个关键抽象的效果:

  • 每个像素都是数组中的一个条目(例如,如果是 RGB 图像则不是 3 个条目)
  • 数字就是他们所说的那样。特别是 255 ≠ 1.0.

加载 seed.tif 图像时,您会注意到 returned 值的类型为 Gray{N0f8}Gray 部分意味着它被解释为灰度图像——如果它是彩色图像,它们可能是像 RGB{N0f8}(1.0, 0.8, 0.4) 这样的元素。在任何一种情况下,访问 img[i,j] returns 关于 整个 像素的所有信息。

您可能最关心的部分是 N0f8。在大多数图像处理框架中,数字的含义取决于它的表示形式(例如 https://scikit-image.org/docs/stable/user_guide/data_types.html)。如果您的数字编码为 UInt8,则 "White" 为 255,但如果您的数字编码为 Float32,则白色为 1.0。当你想改变表示时,你必须记住使用特殊的转换函数,这些函数也会改变像素的值。在其他数学领域我不知道等式 255 == 1.0.

为了停止鼓励糟糕的数学,JuliaImages 不厌其烦地定义了协调这些概念的新数字类型。在 JuliaImages 中,白色始终为 1。但是为了支持 8 位图像,我们定义了一个新的数字类型 N0f8,其中 8 位的最大值为 1。这些在内部表示就像 UInt8,它们只是被解释为被 255 除。类似地,16 位图像有 N0f16,甚至像 N4f12 这样有用的特殊类型,例如,如果你正在收集图像使用 12 位相机。这意味着可以简单地通过查找值为 1 的像素来检测图像饱和度。

当然,有时您可能希望以不同的方式看待事物。 JuliaImages 支持多个 "views" 提供对相同按位数据的替代解释。在你的情况下,

rawview(channelview(seed))

会 return 一个 UInt8 值的数组,这可能是您所期望的。

但是请注意,如果您要保存不应真正解释为图像的整数数组,可能有更好的格式,例如 HDF5。图像格式有时会受到压缩,这可能会破坏您保存的值。 TIFF 通常被称为无损压缩,但实际上可以使用有损压缩 (https://en.wikipedia.org/wiki/TIFF)。