RGB в HSV через PIL и colorsys

Я написал функцию, которая преобразует изображение из RGB > HSV. Однако, когда я сохраняю новое изображение, единственное, что я получаю, это черное изображение. Что я должен исправить, чтобы решить эту проблему?

Любая помощь приветствуется!

Мой код:

def HSVColor(img):
    if isinstance(img,Image):
        r,g,b = img.split()
        Hdat = []
        Sdat = []
        Vdat = [] 
        for rd,gn,bl in zip(r.getdata(),g.getdata(),b.getdata()) :
            h,s,v = colorsys.rgb_to_hsv(rd/255.,gn/255.,bl/255.)
            Hdat.append(int(h*255.))
            Sdat.append(int(l*255.))
            Vdat.append(int(s*255.))
        r.putdata(Hdat)
        g.putdata(Sdat)
        b.putdata(Vdat)
        return Image.merge('RGB',(r,g,b))
    else:
        return None

person bolzano    schedule 06.03.2014    source источник
comment
Как только вы исправите опечатки (Image должно быть Image.Image, l*255 должно быть s*255 и s*255 должно быть v*255), у меня это сработает.   -  person Mark Ransom    schedule 07.03.2014
comment
О, да!! Опечатка — следствие того, что вы поздно ложитесь спать   -  person bolzano    schedule 07.03.2014


Ответы (3)


Вы не перепутали модуль Image и его класс Image?

У меня работает следующий код (измените часть isinstance(img,Image.Image)):

import Image, colorsys    

def HSVColor(img):
    if isinstance(img,Image.Image):
        r,g,b = img.split()
        Hdat = []
        Sdat = []
        Vdat = [] 
        for rd,gn,bl in zip(r.getdata(),g.getdata(),b.getdata()) :
            h,s,v = colorsys.rgb_to_hsv(rd/255.,gn/255.,bl/255.)
            Hdat.append(int(h*255.))
            Sdat.append(int(s*255.))
            Vdat.append(int(v*255.))
        r.putdata(Hdat)
        g.putdata(Sdat)
        b.putdata(Vdat)
        return Image.merge('RGB',(r,g,b))
    else:
        return None

a = Image.open('/tmp/a.jpg')
b = HSVColor(a)
b.save('/tmp/b.jpg')
person fredtantini    schedule 06.03.2014
comment
что такое 'L' в Sdat.append(int(l*255.)) - person hiquetj; 07.02.2017

Просто к вашему сведению, с последней копией Pillow, вероятно, следует использовать

def rgb2hsv(image):
    return image.convert('HSV')
person K3---rnc    schedule 20.05.2015
comment
Верно, хотя Image.save() может подавиться результатом. Вам нужно будет заставить Pillow видеть каналы как RGB, скопировав их в объект RGB Image. - person bjorke; 21.01.2016
comment
Согласно документации это не поддерживается: pillow.readthedocs.io/en/4.1.x/reference/ - person whlteXbread; 09.04.2017
comment
@whlteXbread В документах просто говорится, что поддерживаются все возможные преобразования между режимами RGB, CYMK и L. Для других преобразований поддержка ограничена, например. RGB → HSV работает, тогда как L → HSV может не работать. - person K3---rnc; 06.12.2018

я думаю, вы пытаетесь сделать невозможное, хотя вы можете преобразовать значения цвета rgb в hsv (и наоборот) в соответствии с wikipedia изображения jpg могут храниться только в моделях rgb или cmyk.

person Tony Cronin    schedule 06.03.2014
comment
Я предполагаю, что цель состоит в том, чтобы получить изображение с ложным цветом, а не получить собственное изображение hsv. - person Mark Ransom; 07.03.2014
comment
@markransom, вы можете конвертировать цвета, но цветовая модель jpg - rgb. возможно, png или gif могут быть лучшим способом для этого варианта использования? - person Tony Cronin; 07.03.2014