gpt4 book ai didi

python-3.x - 如何在 matplotlib 3-D 散点图上表示密度信息

转载 作者:行者123 更新时间:2023-12-03 09:42:25 30 4
gpt4 key购买 nike

我试图将图像中的 r、g、b channel 绘制为 3-D 散点图。

当我有一个黑白图像时,这很有效,因为我得到一个散点图,在散点图的两端只有两个不同的簇。

然而,对于彩色图像,散点图在视觉上没有多大意义,因为有 r、g、b 值对应于图像中颜色空间中的许多点。

所以我最终得到了如下图所示的东西 -

3-D scatter plot without density information

我想实现的是以某种方式表示密度信息。例如,如果对应于 (255,255,255) 的点数为 1000,对应于 (0,0,0) 的点数仅为 500,那么我希望 (255,255,255) 为深红色,而 (0,0,0) 为呈黄色/橙色

我如何在 matplotlib 中实现这一点?我也接受某种气泡效果,其中 (255,255,255) 表示为比 (0,0,0) 更大的气泡,尽管我觉得编码为颜色信息的密度信息在视觉上更具吸引力

最佳答案

这是使用高斯 KDE 的尝试。它仍然远非完美,结果在很大程度上取决于估计参数( bw_method )。也许有一种更简单的方法,也许可以使用 np.unique获取每种独特颜色的频率。

这个想法是将颜色密度分布估计为多元高斯混合,并将其用作散点图的颜色图。

对于任何严肃的事情来说,这有点慢,但我认为它可以通过足够小的图像提供不错的结果。也许一些基于 FFT+卷积的估计方法可能会更快。

让我们看看一些代码。没什么特别的:它以这种方式扁平化和 reshape 图像数据 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用于将 map 标记颜色设置为密度信息, alpha需要透过云看一点。

切尔西

Chelsea the cat color density

随机颜色

random uniform color density

坡度

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

渐变+噪点

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

关于python-3.x - 如何在 matplotlib 3-D 散点图上表示密度信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53826201/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com