我正在尝试创建一个 API,它将图像 URL 作为输入并返回 JSON 格式的调色板作为输出。
它应该像这样工作:http: //lokeshdhakar.com/projects/color-thief/
但应该在 Python 中。我研究了 PIL(Python 图像库),但没有得到我想要的。有人可以指出我正确的方向吗?
Input: Image URL
Output: List of Colors as a palette
我正在尝试创建一个 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]
color-thief 库也可以在 python 中使用: https ://github.com/fengsp/color-thief-py
示例实现:
pip install colorthief
# -*- coding: utf-8 -*-
import sys
if sys.version_info < (3, 0):
from urllib2 import urlopen
else:
from urllib.request import urlopen
import io
from colorthief import ColorThief
fd = urlopen('http://lokeshdhakar.com/projects/color-thief/img/photo1.jpg')
f = io.BytesIO(fd.read())
color_thief = ColorThief(f)
print(color_thief.get_color(quality=1))
print(color_thief.get_palette(quality=1))