2013-09-14 4 views
1

Я пытаюсь создать API, который принимает URL-адрес изображения в качестве входных данных и возвращает обратно цветовую палитру в формате JSON в качестве вывода.Создайте цветовую палитру из изображения URL

Он должен работать что-то вроде этого: http://lokeshdhakar.com/projects/color-thief/

Но должно быть в Python. Я просмотрел PIL (Библиотека изображений Python), но не получил то, что хочу. Может ли кто-нибудь указать мне в правильном направлении?

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

'Я смотрел в PIL (Python Library изображения), но не понял, что я want' - заботиться о разработке? –

+0

Поскольку я новичок в PIL, я не мог найти инструменты, необходимые для этого. – Jyotiska

ответ

5
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] 
+0

Ну, я хочу получить 10 лучших доминирующих цветов. Как получить это из вывода? – Jyotiska

+0

Как я получу шестизначный код цвета, например # 000000 –

+0

@ManishPatel: взгляните на http://stackoverflow.com/questions/9448029/print-an-integer-array-as-hexadecimal-numbers. Если это не отвечает на ваш вопрос, отправьте новый вопрос с образцом вашего ввода (это массив, список, int?) И ожидаемый результат. – unutbu

Смежные вопросы