2017-03-28 86 views
-1

我想抽樣RGB或HSV顏色插值從綠色到藍色。不過,我希望高斯的平均值應該是綠色的,這樣大部分的高斯將被綠色所控制。最後,當我從綠色插入藍色或紅色時,我想實現這一點,你開始偏離人羣。事情是這樣的,但大部分應該是綠色..python,如何生成一組正常分佈的RGB顏色

enter image description here

+0

我不確定你在問什麼,但如果你正在繪製數據,請閱讀matplotlib中新默認顏色映射背後的推理http://matplotlib.org/users/dflt_style_changes.html –

+0

我需要採用RGB或其他顏色格式的數據樣本,符合上述的分佈。 –

+0

「cmap = cm.jet'' colorbar的顏色是否以綠色表示?所以''cmap(val)''其中val是你從高斯分佈中抽取的樣本應該返回你想要的。 – alexblae

回答

0

這可以通過使用HS V色彩空間,純綠色爲H = 120度。您可以創建在中心約meannum點HV空間二元正態分佈,並根據協方差矩陣cov分佈:

import numpy as np 

num = 1000 
mean = [120,0.5] # [hue,value] 
cov = [[20,0],[0,0.01]] 
hv = np.random.multivariate_normal(mean,cov,num) 

接下來,我們模矩陣,以便超越邊界點被環回:

hv[:,0] %= 360 
hv[:,1] %= 1 

接下來,我們從here藉以在HS空間的RGB圖(V = 1):

from matplotlib.colors import hsv_to_rgb 
import matplotlib.pyplot as plt 

V, H = np.mgrid[0:1:100j, 0:1:300j] 

S = np.ones_like(V) 
HSV = np.dstack((H,S,V)) 
RGB = hsv_to_rgb(HSV) 

plt.imshow(RGB, origin="lower", extent=[0, 360, 0, 1], aspect=150) 

最後,我們覆蓋到分佈H-航天:

plt.scatter(hv[:,0],hv[:,1]) 
plt.show() 

enter image description here 可以玩弄cov以達到所需的分佈。例如,cov = [[80,0.7],[0.1,0.006]]給我們

enter image description here

此外,您還可以這個例子很容易地擴展到三個維度考慮飽和度的變化。

0

一種選擇如下。
您首先需要一個在其中心具有綠色的顏色圖。如果沒有可用的standard colormaps適合您,您可以構建自己的色彩地圖。在最簡單的情況下,將包括三種顏色(藍色,綠色,紅色)

colors = ["blue", "green", "red"] 
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("name", colors) 

然後,您可以在正態分佈的中心使用一個標準化的實例,其中心。這裏我們選擇它在0;因此歸一化限制需要對稱於零。現在

norm = matplotlib.colors.Normalize(vmin=-3, vmax=3) 

,具有正態分佈變量x您可以從顏色表作爲範例,

sample = cmap(norm(x)) 

爲了繪製這個,看看下面一個完整的例子:

import matplotlib 
import matplotlib.pyplot as plt 
import numpy as np 


n = 600 
x = np.random.normal(size=n) 
y = np.random.rand(n) 

colors = ["blue", "green", "red"] 
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("name", colors) 
norm = matplotlib.colors.Normalize(vmin=-3, vmax=3) 
fig, (ax, ax2) = plt.subplots(nrows=2, figsize=(6,3), 
     gridspec_kw={"height_ratios":[1,3]}, sharex=True) 
ax.axis("off") 
ax.hist(x, bins=21, edgecolor="k") 
sc = ax2.scatter(x,y,s=15, c=x, cmap=cmap, norm=norm) 
fig.colorbar(sc, ax=ax2) 
cax = fig.colorbar(sc, ax=ax) 
cax.ax.set_visible(False) 
plt.show() 

enter image description here

+0

y軸表示什麼? – Crispin

+0

y軸只是用來伸展空間中的點。如果他們都在一條線上,那麼你就不能再區分它們了。相關維度是x維度,根據色彩地圖在空間和顏色中進行編碼。 – ImportanceOfBeingErnest