【问题标题】:How can I get the pixel colors in matplotlib?如何在 matplotlib 中获取像素颜色?
【发布时间】:2017-03-18 21:49:44
【问题描述】:

我正在用matplotlib.patches 绘制一组矩形。我的代码是:

import matplotlib.pyplot as plt
import matplotlib.patches as patches

fig = plt.figure(figsize=(14, 10))

for i in rectangles_list:

    ax1 = fig.add_subplot(111, aspect='equal')
    ax1.add_patch(patches.Rectangle(
                 (x[i], y[i]),
                  width[i],
                  height[i],
                  alpha = 1.0,
                  facecolor = colors_list[i]
                 )
                 )

plt.show()

矩形可能重叠,因此其中一些可能完全隐藏。你知道是否可以获得可见矩形的颜色吗?我的意思是没有完全隐藏的矩形的颜色,因此用户可以实际查看。我正在考虑一些返回像素颜色的函数,但欢迎更多聪明的想法。如果可能的话,我宁愿不使用 PIL。不幸的是,我在互联网上找不到任何解决方案。

【问题讨论】:

  • 我认为 matplotlib 没有内置方法可以做到这一点。但是,您可能会发现 shapely 很有用。 (见unioncontains。)
  • 无法运行您的代码,缺少rectangles_list。如何降低 alpha 值,以便您可以看到顶部矩形后面的任何内容。
  • 我认为应该可以通过 numpyfig.canvas.tostring_argb() 包装到 ARGB 数组中以获取所有屏幕颜色。现在不确定是否继续,但可能是一个开始。
  • 我认为了解这样做的目的会有所帮助。可能有比根据需要获取颜色更好的解决方案。
  • 非常感谢您的所有 cmets。我不得不说我已经遵循了 unutbu 的建议,并且我已经为几个矩形的交集实现了一个复杂的公式。我不详细介绍,但是您需要一个类似于此处显示的公式来计算多个集合的并集概率statistics.about.com/od/Formulas/a/… 我也将尝试让-塞巴斯蒂安的代码。

标签: python matplotlib pixel


【解决方案1】:

根据 Vlass Sokolov 的评论和 Joe Kington 的 Stackoverflow post,您可以通过以下方法获得一个 numpy 数组,其中包含在 matplotlib 图上可见的所有独特颜色:

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import numpy as np

plt.close('all')

# Generate some data :

N = 1000
x, y = np.random.rand(N), np.random.rand(N)
w, h = np.random.rand(N)/10 + 0.05, np.random.rand(N)/10 + 0.05
colors = np.vstack([np.random.random_integers(0, 255, N),
                    np.random.random_integers(0, 255, N),
                    np.random.random_integers(0, 255, N)]).T

# Plot and draw the data :

fig = plt.figure(figsize=(7, 7), facecolor='white')
ax = fig.add_subplot(111, aspect='equal')
for i in range(N):
    ax.add_patch(Rectangle((x[i], y[i]), w[i], h[i], fc=colors[i]/255., ec='none'))
ax.axis([0, 1, 0, 1])
ax.axis('off')
fig.canvas.draw()

# Save data in a rgb string and convert to numpy array :

rgb_data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='')
rgb_data = rgb_data.reshape((int(len(rgb_data)/3), 3))

# Keep only unique colors :

rgb_data = np.vstack({tuple(row) for row in rgb_data})

# Show and save figure :

fig.savefig('rectangle_colors.png')
plt.show()

【讨论】:

  • 哇,太美了!按照 unutbu 的建议,我以几何方式完成了它,但今天晚些时候也会检查你的代码,我肯定会使用它,因为它看起来比我的更优雅和直接!
  • @user2983638 不客气,我很高兴它成功了。
  • 很抱歉,只有一个问题。我正在尝试确定与rgb_data 中的颜色相对应的colors 中颜色的索引。由于rgb_data[0, 255] 格式,而colors[0, 1] 格式,我将rgb_data 除以255。不幸的是,Python 无法匹配这两个列表中的颜色,因为它们略有不同。我正在尝试对数字进行四舍五入,但这只有在我将它们四舍五入时才有效,这不是很好。你知道如何解决这个问题吗?
  • @user2983638 这很有趣。那是因为我们在此过程中丢失了信息......如果您的应用程序可能,也许一个解决方案是使用 np.random.random_integers(0, 255, N) 而不是 @987654334 为 matplotlib 提供 [0, 255] 范围内定义的颜色@。然后,您将能够轻松地从 rgb_data 中生成的 0-255 整数中确定索引?我已经更新了我的答案来说明这一点。
  • 是的,现在它可以完美地确定索引,而无需四舍五入随机数!再次感谢让-塞巴斯蒂安!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 2013-07-11
相关资源
最近更新 更多