这是使用高斯 KDE 的尝试。它仍然远非完美,结果很大程度上取决于估计参数 ( bw_method
)。也许有一种更简单的方法,也许是np.unique
用来获取每种独特颜色的频率的方法。
这个想法是将颜色密度分布估计为多元高斯混合,并将其用作散点图的颜色图。
对于任何严重的事情来说它有点慢,但我认为它可以用足够小的图像给出很好的结果。也许一些基于 FFT+卷积的估计方法可能会更快。
让我们看一些代码。没什么特别的:它以喜欢的方式展平和重塑图像数据gaussian_kde
,并返回 RGB 和密度分量。你可以玩一下bw_method
,看看结果如何变化,越大,你得到的密度就越平滑。
from scipy.stats import gaussian_kde
def img_to_rgbk(img, bw=0.1):
rgb = img.reshape(-1, 3).T
k = gaussian_kde(rgb, bw_method=bw)(rgb)
r, g, b = rgb
return r, g, b, k
这是带有玩具图像的结果
img = chelsea()[100:200, 100:200]
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
r, g, b, k = img_to_rgbk(img, bw=0.5)
ax.scatter(r, g, b, c=k, alpha=0.2)
注意c=k
用于将地图标记颜色设置为密度信息,alpha
需要通过云看到一点。
切尔西

随机颜色

坡度
请注意,您可以在此处看到错误的带宽选择是如何产生误导的。足够小的bw_method
每列应该基本上显示一种颜色,沿行重复。因此,每个点都应该具有相同的颜色(并且具有正确的带宽)。

渐变+噪点
这里有更好的带宽和一些噪音来传播颜色。请注意白色区域周围的较大密度,其中无噪声图中的不连续性变为密度最大值。
