通过PIL和colorsys将RGB转换为HSV

5 投票
3 回答
31927 浏览
提问于 2025-04-17 21:12

我写了一个函数,用来把图像从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

3 个回答

4

我觉得你在尝试做一些不可能的事情。虽然你可以把RGB颜色转换成HSV颜色(反之亦然),但是根据维基百科的说法,JPEG格式的图片只能用RGB或CMYK这两种颜色模型来存储。

28

仅供参考,使用最近版本的Pillow时,应该使用

def rgb2hsv(image):
    return image.convert('HSV')
2

你是不是把模块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')

撰写回答