【发布时间】:2021-07-22 02:09:25
【问题描述】:
我目前正在开发一系列测试代码来探索处理图像数据的不同方式,其中一个主要主题是颜色提取。
我开发了以下 Python 代码,给定图像,它能够提取其对应的具有 R、G 和 B 值的直方图:
# Reading original image, in full color
img = mpimg.imread('/content/brandlogos/Images/14 (48).jpg')
# Displaying the image
imgplot = plt.imshow(img)
plt.show()
# Creating a tuple to select colors of each channel line
colors = ("r", "g", "b")
channel_ids = (0, 1, 2)
# Making an histogram with three lines, one for each color
# The X limit is 255, for RGB values
plt.xlim([0,256])
for channel_id, c in zip(channel_ids, colors):
histogram, bin_edges = np.histogram(
img[:, :, channel_id], bins = 256, range=(0,256)
)
plt.plot(bin_edges[0:-1], histogram, color=c )
# Displaying the histogram
plt.xlabel("Color Value")
plt.ylabel("Pixels")
plt.show()
例子:
但是,我现在想根据直方图信息找到最主要颜色的 RGB 值。
预期输出:(87, 74, 163)(或类似的东西)
我将如何找到三个颜色通道的最高 bin 计数,并将它们组合成一种颜色?
【问题讨论】:
-
您需要为 RGB 值构建 3D 直方图(联合直方图),而不是为每个通道构建单独的直方图(边际直方图)。在 3D 直方图中,您可以找到最高峰,您可以找到权重最大的峰,或其他任何数量的东西。这取决于您如何定义“主色”。
-
主色是指像素数最多的 R、G 和 B。例如,如果我在上面展示的直方图中找到峰值,我会得到非常接近 (87, 74, 163) 的值。这就是我打算以编程方式执行的操作:找到三个通道中每个通道的“颜色值”峰值。
-
您不能对每个频道执行此操作。您需要使用联合直方图。最高峰适用于像您的示例这样具有大部分平坦区域的图像,但不适用于自然图像,我们认为一种颜色可以分布在直方图的许多区域中。这就是为什么我问你的定义。您的所有图片都像您示例中的图片吗?
-
我所有的图片都是公司标志。它们在细节和形状上差异很大,但通常由纯色和文字组成。
标签: python image-processing colors histogram