将原色从图像打印到电子表格?

时间:2018-07-27 16:10:35

标签: python excel image colors openpyxl

我正在尝试从图像中提取原色,并将其输入到电子表格中。我正在使用a script I found分析图像中的原色并将其添加到条形图中。

(我很抱歉在某些领域缺乏知识,我是使用Python的完整初学者。)

请在下面查看我正在使用的脚本:

import cv2
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans


def find_histogram(clt):
    """
    create a histogram with k clusters
    :param: clt
    :return:hist
    """
    numLabels = np.arange(0, len(np.unique(clt.labels_)) + 1)
    (hist, _) = np.histogram(clt.labels_, bins=numLabels)

    hist = hist.astype("float")
    hist /= hist.sum()

    return hist
def plot_colors2(hist, centroids):
     bar = np.zeros((50, 300, 3), dtype="uint8")
     startX = 0

    for (percent, color) in zip(hist, centroids):
        # plot the relative percentage of each cluster
        endX = startX + (percent * 300)
        cv2.rectangle(bar, (int(startX), 0), (int(endX), 50),
                  color.astype("uint8").tolist(), -1)
        startX = endX

    # return the bar chart
    return bar

img = cv2.imread("testimg1.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

img = img.reshape((img.shape[0] * img.shape[1],3)) #represent as 
row*column,channel number
clt = KMeans(n_clusters=5) #cluster number
clt.fit(img)

hist = find_histogram(clt)
bar = plot_colors2(hist, clt.cluster_centers_)

plt.axis("off")
plt.imshow(bar)
plt.show()

我用来测试的图像: Test Image

我从运行脚本获得的输出是一个带有条形图和图像中三种主要颜色的窗口:Script Output Result

当前,我正在尝试弄清楚如何检索图像中每种原色的rgb或十六进制颜色代码,并将它们放入电子表格中以进行批量数据检索。

电子表格最好如下所示: Spreadsheet Layout

我相信我可以使用诸如openpyxl之类的库来执行此操作,但是我什至不知道如何做到这一点。我的主要问题是弄清楚如何从颜色中提取RGB代码以及它们各自的百分比。如果可以解释,我很可能想出如何通过openpyxl将其发送到电子表格的方法。

此外,当将数据发送到Excel时,我不需要出现显示条形图的窗口,因为它将进入电子表格,因此这是不必要的。我无法在脚本中找到创建显示图形的确切位置,所以我不想意外删除任何基本代码并破坏脚本。

让我知道是否有人对如何实现这一目标有任何投入或反馈。

谢谢!

1 个答案:

答案 0 :(得分:0)

您最需要的关键是在this answer中。简要地说,使用Python图像库。

pixel_map

Counter是RBG三元组的2D数组(不是列表)。从这里开始,使用dict(一种特殊的from collections import Counter pixel_ct = Counter(pixel_map) 结构(RGB三元组作为键,频率作为值)来轻松整理像素值:

sum

您可以rows, cols = pixel_map.size()进行计数以获得总数,也可以使用observeEvent(input$dataset, { output$downloadData <- download(input$dataset,datasetInput()) }) 提取尺寸并将两个值相乘。将每个顶部像素数除以总大小,就可以得出百分比。

你能从那里拿走吗?