2017-02-07 66 views
0

對不起。我在這裏新的在stackoverflow。我正在處理在2D平面中投影高維數據的自組織映射(SOM),其中該平面中的每個「節點」或框包含的值在0到1範圍內的值相對較小。如何將多維向量轉換爲RGB值以供說明?

下面是我想用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列的值。

也許你想知道爲什麼它有一個藍色。 原因是,當插入向量的3個第一個值(大約爲(0,0,1))時,它會生成BLUEISH顏色爲0.999923 x 255 = 254,所以它看起來像(0,0,254) 。

現在我想利用節點的所有權重來爲BOX生成一種顏色,以便它可以產生如下所示的顏色變化。

SOM Lattice 2

我也知道,我認爲,該值是如此之小,我需要一些正常化。

我想問任何想法如何 - 正常化的值 - 使用所有的重量來創建一個顏色來繪製節點。 (更重要)

謝謝。請隨時要求澄清。

+0

嘗試乘以2550而不是255,然後用類似'(x> 255)的東西剪切到255? 255:x; ' –

+0

你有11個重量。也許有一些明智的方法將第一個9組織成3x3矩陣,然後找到特徵向量或特徵值。任何一個都可以用於rgb載體 –

+0

問題是,權重實際上是變化的。我的意思是,有時它有11個權重,有時是20,有時是30等。 –

回答

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倍亮。明亮的組件會飽和,但他們已經接近這樣做了。飽和組件將被三元運算符?:截斷。

+0

使用該代碼,它變成了這樣,[鏈接](http://imgur.com/a/vbCec),原來的代碼就像這樣[link](http://imgur.com/a/5dI9v)。 –

+0

@ James-AndrewSarmiento。你應該根據你的實際數據來玩「標準化」的價值。我無法訪問它,所以我不能爲你做。它看起來像10不夠大,你的情況。另外,如果每個通道的值範圍保持一致,請考慮對每個通道使用單獨的標準化。例如,看起來你總是希望對紅色進行更高的標準化,而不是對綠色和藍色進行標準化。 –