我试图在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}
- 代码不起作用(请参阅要点)。
答案 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)
第二个“全白”图像代表饱和度。在另一种语言中,“5”表示两个完全不同的东西,具体取决于它是作为UInt8
还是Float64
存储在内存中。我认为可以公平地说,在任何正常情况下,数字图书馆的用户都会把这称为一个错误,而且是一个非常严重的错误,但不知何故,我们中的许多人已经开始在图像处理环境中接受这一点。 / p>
这些新类型的产生是因为在Julia中我们已经努力实现新的数值类型(FixedPointNumbers),其作用类似于小数值(例如,介于0和1之间),但内部存储的位数模式与“对应的“UInt8
(乘以255得到的那个)。这允许我们使用8位数据,但允许值始终以一致的比例解释(0.0 =黑色,1.0 =白色)。