我有一幅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
加载该文件时,您会看到JuliaImages的两个关键抽象的效果:
加载seed.tif
图像时,您会注意到返回值的类型为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)。如果您的数字编码为UInt8
,则“白色”为255 ,但是如果您的数字编码为,则白色为1.0 Float32
。要更改表示形式时,必须记住使用特殊的转换功能,这些功能也会更改像素的值。在其他任何数学领域,我都没有意识到255 == 1.0。
为了停止鼓励不良数学,JuliaImages忙于定义新的数字类型以协调这些概念。在JuliaImages中,白色始终为1。但是,为了支持8位图像,我们定义了一个新的数字类型N0f8
,其8位最大值为1。它们在内部表示的方式与一样UInt8
,它们被解释为好像已被划分了一样。乘以255。类似地,还有N0f16
16位图像,甚至像N4f12
这样的特殊类型也很有用,例如,如果您要使用12位相机收集图像。这意味着可以简单地通过查找值为1的像素来检测图像饱和度。
当然,有时您可能希望以不同的方式看待事物。JuliaImages支持多个“视图”,它们为相同的按位数据提供了另一种解释。就你而言
rawview(channelview(seed))
将返回UInt8
可能是您期望的值的数组。
但是请注意,如果要保存一个不应该真正解释为图像的整数数组,则可能有更好的格式,例如HDF5。图像格式有时会受到压缩,从而损坏您保存的值。TIFF通常被称为无损压缩,但实际上可以使用有损压缩(https://en.wikipedia.org/wiki/TIFF)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句