将RGBA {U8}(0.384,0.0,0.0,1.0)转换为Integer

时间:2016-04-28 04:50:18

标签: julia image-segmentation rgba

我在Images.jl中使用Julia。我试图将图像转换为类似图形的数据结构(v,w,c),其中

  • v是一个节点

  • w是邻居,

  • c是成本函数

我想给那些颜色不同的邻居付出昂贵的代价。但是,当我加载图像时,每个像素都有以下类型RGBA{U8}(1.0,1.0,1.0,1.0),有没有办法将其转换为Int64或Float等数字?

3 个答案:

答案 0 :(得分:4)

如果您只想惩罚具有不同颜色值的相邻对(无论差异有多小),我认为img[i,j] != img[i+1,j]应该足够,并且比调用colordiff更高效。

Images.jl还包含方法rawseparate,允许您将该图像“转换”为更高维的UInt8数组。但是,对于明显的应用程序而言,这可能会更加困难,因为您必须在使用A[:, i, j] != A[:, i+1, j]之类的语法(它将分配内存并具有更差的性能)或写出循环并检查每个语法之间进行选择。手动颜色通道。然后总是有一点点烦恼,特殊情况你的灰度和颜色的代码,想知道3d数组真正意味着什么(是3D灰度还是带有颜色通道的2d?),并想知道颜色通道是否存储为第一个或最后一个维度。

如果您只是直接使用RGBA格式处理数据,则不会出现这些烦恼。对于更多的背景,它们是Julia的“不可变”对象的例子,它们至少有两个优点。首先,它们允许您清楚地指定某些数字集合的“含义”(在这种情况下,这4个数字表示特定颜色空间中的颜色,而不是传感器的压力读数)---这意味着您可以编写不强制做出无法强制执行的假设的代码。其次,一旦你学会了如何使用它们,它们就会使你的代码变得更漂亮,同时提供出色的性能。

颜色类型记录为here

答案 1 :(得分:4)

如果您想要的只是幅度差异,我建议您将每个像素转换为灰度。

请参阅此答案以获取操作方法:

Converting RGB to grayscale/intensity

这将为您提供一个强度值,然后您可以使用它进行比较。

答案 2 :(得分:3)

根据@ daycaster的建议,可以使用Colors.jl中的colordiff

colordiff采用两种颜色作为参数。要使用它,您应该使用color提取像素的颜色部分,即colordiff(color(v),color(w)),其中v将是RGBA{U8(0.384,0.0,0.0,1.0)值。