如何将多维向量转换为RGB值以进行说明?

时间:2017-02-07 11:18:09

标签: java arrays rgb som

对不起。我是stackoverflow的新人。我正在使用自组织映射(SOM),它处理在2D平面中投影高维数据,其中此平面中的每个“节点”或框包含的值相对较小,范围从0到1。

以下是我想要用RGB值着色的格子或矩阵的示例。

SOM Lattice

例如,插图中的框包含类似

的权重
[0.000124, 0.000000004, 0.999923, 0.119999220, 0.999311, 0.000552, 0.00000001223, 0.00045, 0.00001132, 0.99999998211, 0.00000000000000008821]

我的算法只会尝试考虑第一个三个值

this.setNodeColor(new Color((int)this.getDoubleElementAt(0) * 255,(int)(this.getDoubleElementAt(1)*255),(int)(this.getDoubleElementAt(2)*255))) 

并且此算法生成上图。

格子中的每个方框都有自己的权重,就像我上面发布的那样。 现在考虑上面给出的向量。这是晶格中第一个BOX第0行,第0列的值。

也许你想知道为什么它有蓝色。 原因是当你在RGB上插入向量的大约(0,0,1)的3个第一个值时,它会产生蓝色,为0.999923 x 255 = 254,所以它看起来像是(0,0,254)。

现在我想利用节点的所有权重为BOX生成一种颜色,以便它产生如下颜色的变化。

SOM Lattice 2

我也知道,我认为,这些值太小了,我需要一些正常化。

我想问一下如何做 - NORMALIZE值 - 使用所有权重来绘制颜色来绘制NODE。 (更重要的)

谢谢。请随时要求进一步澄清。

1 个答案:

答案 0 :(得分:0)

要标准化值,您可以缩放到大于255的数字。您可以转换您提供的示例并将其重写为

int normalization = 10;
int r = (int)this.getDoubleElementAt(0) * 255 * normalization;
int g = (int)this.getDoubleElementAt(1) * 255 * normalization;
int b = (int)this.getDoubleElementAt(2) * 255 * normalization;
this.setNodeColor(new Color((r > 255) ? 255 : r,
                            (g > 255) ? 255 : g,
                            (b > 255) ? 255 : b));

这将使您的微弱颜色成分亮10倍。明亮的组件会饱和,但无论如何它们都接近于这样做。饱和分量将被三元运算符?:限制。