将灰度数组转换为FloatingPoint-Array

时间:2017-12-09 15:25:00

标签: julia tiff geotiff

我试图在julia中读取.tif文件作为浮点数组。使用 FileIO & ImageMagick -Package我能够做到这一点,但我得到的数组是Array{ColorTypes.Gray{FixedPointNumbers.Normed{UInt8,8}},2}类型。

我可以将这个FixedPoint-Array转换为Float32-Array,将其乘以255(因为UInt8),但我正在寻找一个函数来为任何类型的FixedPointNumber(即reinterpret()或{{1 }})。

convert()

输出是

using FileIO
# Load the tif
obj = load("test.tif");
typeof(obj)
# Convert to Float32-Array
objNew = real.(obj) .* 255
typeof(objNew)

我一直在查看文档很长一段时间没找到将给定的FixedPoint-Array转换为FloatingPont-Array而不将其与Integer类型的最大值相乘的函数。

感谢您的帮助。

修改: 我让a small gist看看迈克尔的解决方案是否有效,而且确实如此。谢谢!

注意:我不知道为什么,但julia> using FileIO julia> obj = load("test.tif"); julia> typeof(obj) Array{ColorTypes.Gray{FixedPointNumbers.Normed{UInt8,8}},2} julia> objNew = real.(obj) .* 255; julia> typeof(objNew) Array{Float32,2} - 代码不起作用(请参阅要点)。

2 个答案:

答案 0 :(得分:3)

为什么不只是Float32.()

using ColorTypes
a = Gray.(convert.(Normed{UInt8,8}, rand(5,6)));
typeof(a)
#Array{ColorTypes.Gray{FixedPointNumbers.Normed{UInt8,8}},2}
Float32.(a)

答案 1 :(得分:2)

简短的答案确实是Michael给出的答案,只需使用Float32.(a)(灰度)。另一种替代方案是channelview(a),它通常执行通道分离,因此也从阵列中剥离颜色信息。在后一种情况下,您将无法获得Float32数组,因为您的图像以每像素8位存储,而是获得N0f8(= FixedPointNumbers.Normed{UInt8,8})。您可以阅读这些数字here

考虑到其他图像处理框架的工作原理,你的本能乘以255是很自然的,但是朱莉娅已经做了一些努力,以值得花一点时间思考的方式保持“意义”的一致性。例如,在另一种编程语言中只是改变数组的数值精度:

img = uint8(255*rand(10, 10, 3));   % an 8-bit per color channel image
figure; image(img)
imgd = double(img);   % convert to double-precision, but don't change the values
figure; image(imgd)

产生以下令人惊讶的结果: 8bit version double version

第二个“全白”图像代表饱和度。在另一种语言中,“5”表示两个完全不同的东西,具体取决于它是作为UInt8还是Float64存储在内存中。我认为可以公平地说,在任何正常情况下,数字图书馆的用户都会把这称为一个错误,而且是一个非常严重的错误,但不知何故,我们中的许多人已经开始在图像处理环境中接受这一点。 / p>

这些新类型的产生是因为在Julia中我们已经努力实现新的数值类型(FixedPointNumbers),其作用类似于小数值(例如,介于0和1之间),但内部存储的位数模式与“对应的“UInt8(乘以255得到的那个)。这允许我们使用8位数据,但允许值始终以一致的比例解释(0.0 =黑色,1.0 =白色)。