1

我有一个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- float 的值与我期望的整数值不对应。例如,在我的图像中有值 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

4

1 回答 1

3

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

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

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

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

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

当然,有时您可能希望以不同的方式看待事物。JuliaImages 支持几个“视图”,它们提供了对相同按位数据的另一种解释。在你的情况下,

rawview(channelview(seed))

将返回一个值数组,UInt8这可能是您所期望的。

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

于 2019-11-24T09:11:28.093 回答