Skip to main content
 首页 » 编程设计

python之从图像 URL 构建调色板

2025年05月04日9davidwang456

我正在尝试创建一个 API,它将图像 URL 作为输入并返回 JSON 格式的调色板作为输出。

它应该像这样工作:http://lokeshdhakar.com/projects/color-thief/

但应该在 Python 中。我查看了 PIL(Python 图像库)但没有得到我想要的。有人可以指出我正确的方向吗?

Input: Image URL 
Output: List of Colors as a palette 

请您参考如下方法:

import numpy as np 
import Image 
 
def palette(img): 
    """ 
    Return palette in descending order of frequency 
    """ 
    arr = np.asarray(img) 
    palette, index = np.unique(asvoid(arr).ravel(), return_inverse=True) 
    palette = palette.view(arr.dtype).reshape(-1, arr.shape[-1]) 
    count = np.bincount(index) 
    order = np.argsort(count) 
    return palette[order[::-1]] 
 
def asvoid(arr): 
    """View the array as dtype np.void (bytes) 
    This collapses ND-arrays to 1D-arrays, so you can perform 1D operations on them. 
    http://stackoverflow.com/a/16216866/190597 (Jaime) 
    http://stackoverflow.com/a/16840350/190597 (Jaime) 
    Warning: 
    >>> asvoid([-0.]) == asvoid([0.]) 
    array([False], dtype=bool) 
    """ 
    arr = np.ascontiguousarray(arr) 
    return arr.view(np.dtype((np.void, arr.dtype.itemsize * arr.shape[-1]))) 
 
 
img = Image.open(FILENAME, 'r').convert('RGB') 
print(palette(img)) 

palette(img) 返回一个 numpy 数组。每行都可以解释为一种颜色:

[[255 255 255] 
 [  0   0   0] 
 [254 254 254] 
 ...,  
 [213 213 167] 
 [213 213 169] 
 [199 131  43]] 

获取前十种颜色:

palette(img)[:10]