Floating point 从Julia中的像素检索RGB向量
我很难弄清楚如何在Julia中检索像素的RGB向量的分量。例如,如果我有一个图像,我称之为Floating point 从Julia中的像素检索RGB向量,floating-point,julia,rgb,pixel,Floating Point,Julia,Rgb,Pixel,我很难弄清楚如何在Julia中检索像素的RGB向量的分量。例如,如果我有一个图像,我称之为image,我选择一个像素,比如说image[2301566],那么如果我想要,比如说,RGB向量的绿色分量,我倾向于只做RGB(图像[2301566]).g。但是,这样的东西将返回一个字符串,如0.778N0f8。我知道这意味着“用8个分数位标准化”,但这不是我想要的。我只是希望实际的浮点数是一个数字,这样我就可以对它执行其他操作。你知道我该怎么做吗?提前谢谢
image
,我选择一个像素,比如说image[2301566]
,那么如果我想要,比如说,RGB向量的绿色分量,我倾向于只做RGB(图像[2301566]).g
。但是,这样的东西将返回一个字符串,如0.778N0f8
。我知道这意味着“用8个分数位标准化”,但这不是我想要的。我只是希望实际的浮点数是一个数字,这样我就可以对它执行其他操作。你知道我该怎么做吗?提前谢谢为了更好地理解正在发生的事情,让我们考虑一个像素:
julia> using Colors
julia> pixel = colorant"purple"
RGB{N0f8}(0.502,0.0,0.502)
我们可以看到,RGB
类型默认使用typeN0f8
来存储它的值。让我们看看里面
julia> dump(pixel)
RGB{FixedPointNumbers.N0f8}
r: FixedPointNumbers.N0f8
i: UInt8 0x80
g: FixedPointNumbers.N0f8
i: UInt8 0x00
b: FixedPointNumbers.N0f8
i: UInt8 0x80
您可以看到,实际上,在内部,一个像素包含一组名为r
、g
、b
的无符号8位整数,它们的值保存在i
字段中
但是,访问这些值的正确方法是通过红色
、绿色
、蓝色
方法,而不是字段:
julia> dump(red(pixel))
FixedPointNumbers.N0f8
i: UInt8 0x80
如果要获取浮点值,可以执行以下操作:float(红色(像素))
:
但是请注意,现在返回的值比原始数据大4倍(32位而不是8位)
如果您希望获得原始数据(8位),可以执行以下操作:
julia> reinterpret(red(pixel))
0x80
希望这一切都能解决。
0.778N0f8
不是字符串,而是您可以操作的实际数字。例如,尝试0.778N0f8+1
。如果有任何操作遇到问题,您可以执行float(0.778N0f8)
或使用任何转换,如Float16
或其他任何操作。感谢您的全面响应。非常感谢!这是一个出色的答案。为了进一步说明为什么“访问这些值的正确方法是通过red
,…”:Julia的颜色生态系统还支持常见的颜色编码方案,如ARGB32
,它将颜色打包到UInt32
的特定位中。在这种情况下,没有可访问的c.r
字段,但red(c)
仍将返回红色通道的值。无论采用何种表示形式,访问器方法始终是安全的。
julia> reinterpret(red(pixel))
0x80