python,如何生成一组正常分布的RGB颜色

时间:2017-03-28 05:50:07

标签: python numpy matplotlib colors

我想采样从绿色到蓝色插值的RGB或HSV颜色。但是,我希望高斯的平均值应该是绿色的,以便该组的大部分将由绿色支配。最后,我想实现这一点,当你从绿色到蓝色或红色进行插值时,你开始偏离人群。像这样的东西,但大多数应该是绿色的..

enter image description here

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这可以使用HSV色彩空间来实现,其中纯绿色在H = 120度。您可以在以num为中心的mean点的H-V空间中创建双变量正态分布,并根据协方差矩阵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-S空间:

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

此外,您可以轻松地将此示例扩展为三维,以考虑饱和度的变化。