从像素中提取RGB向量(Julia语言)

4

我正在努力想出如何在Julia中检索像素的RGB向量组件。例如,如果我有一张名为image的图像,并选择一个像素,比如image[230,1566],那么如果我想要RGB矢量的绿色分量,我的倾向是仅仅执行RGB(image[230,1566]).g。然而,这样的结果会返回一个类似于0.778N0f8的字符串。我知道这意味着“使用8个小数位进行归一化”,但这不是我想要的。我只想得到实际的浮点数作为数字,以便可以对其执行其他操作。你有任何想法如何解决这个问题吗?提前感谢!


5
0.778N0f8 不是一个字符串,而是一个实际的数字,您可以对其进行计算操作。例如,尝试执行 0.778N0f8 + 1。如果您遇到任何操作问题,可以使用 float(0.778N0f8) 或任何转换方式,如 Float16 等。 - DNF
1个回答

4
为了更好地理解正在发生的事情,让我们考虑一个像素:
julia> using Colors

julia> pixel = colorant"purple"
RGB{N0f8}(0.502,0.0,0.502)

我们可以看到,默认情况下,RGB 类型使用 N0f8 类型来存储其值。让我们来看一下内部情况。
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位整数,它们在字段中保持其值。

但是,访问这些值的正确方式是通过redgreenblue 方法而不是字段:

julia> dump(red(pixel))
FixedPointNumbers.N0f8
  i: UInt8 0x80

如果你想得到浮点数值,可以使用 float(red(pixel)))

julia> dump(float(red(pixel)))
Float32 0.5019608f0

需要注意的是,现在返回的值比原始数据大4倍(32位而不是8位)。

如果您希望获取原始数据(即8位数据),可以执行以下操作:

julia> reinterpret(red(pixel))
0x80

希望这样清楚明了。

非常感谢您提供如此详尽的回复,我们非常感激! - change_picture
1
这是一个杰出的答案。关于为什么“访问这些值的正确方式是通过red...”:Julia的颜色生态系统还支持常见的颜色编码方案,如ARGB32,它将颜色打包到UInt32的特定位中。在这种情况下,没有c.r字段可供访问,但是red(c)仍然会返回红色通道的值。无论表示如何,访问器方法始终是安全的。 - tholy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接