使用PIL进行RGB到HSV的转换

时间:2010-12-29 13:45:30

标签: python python-imaging-library color-space

我正在尝试自动增强一些要转换为数码相框的图像。我有适当的代码调整大小,将日期/时间添加到图像的最不重要(最少细节)角落,并将成对的肖像图像粘贴在一起,以避免在帧的41:20低分辨率屏幕中显示单个肖像。 / p>

我为那些光线不太好的照片实现了亮度拉伸滤镜,使用colorsys.rgb_to_hsv函数计算H,S,V波段,在V 1上运行然后转换回来在将数字帧保存为JPEG之前将RGB格式化为RGB。显然,即使使用itertools技巧,转换也需要很长时间;我设法使用psyco改善了一些事情。

但是,我注意到PIL Image.convert的一个示例,其中RGB可以使用4×4矩阵转换为XYZ color space作为convert方法的第二个参数,我得到了想知道:

如何在convert方法调用中使用自定义矩阵将RGB转换为HSV(然后将HSV转换回RGB)? (在这种情况下,小的舍入误差并不重要,所以我不介意每个波段将表示为一系列0 ... 255个整数)

提前谢谢。

2 个答案:

答案 0 :(得分:1)

虽然我已经看过声称HSV色彩空间是RGB的线性变换的参考文献[1],这似乎意味着它可以用矩阵完成,但我一直无法找到或确定自己是什么这样的矩阵看起来像。在某种程度上,基于我所见过的所有[类似]非矩阵程序实现,这并不让我感到惊讶 - 它们的方式不会看起来线性。

无论如何,在调查这篇文章的过程中,我遇到了前SGI研究员Paul Haeberli的在线计算机图形笔记本[{3}}的一篇[有点过时]的文章,其中描述了如何做出多种不同的颜色使用4x4矩阵的转换可能对您有所帮助。给出的所有示例都直接在RGB彩色图像上运行,并且像几何矩阵变换一样,它们的任何序列都可以使用串联组合成单个矩阵。

希望这会有所帮助。

<小时/> [1]:色彩空间转换&lt; Matrix Operations for Image Processing&gt;:

  

2.7.3 HSL(色调饱和度和亮度)

     

这代表了丰富的类似   色彩空间,替代名称   包括HSI(强度),HSV(值),   HCI(色度/色彩),HVC,   TSD(色调饱和度和黑暗度)等   大多数这些色彩空间都是   来自RGB的线性变换和   因此设备依赖和   非线性的。他们的优势在于   非常直观的方式   指定颜色。这很容易   选择所需的色调,然后选择   通过调整稍微修改它   它的饱和度和强度。

答案 1 :(得分:0)

可以在此处找到将RGB值转换为HSV值的公式:http://www.rapidtables.com/convert/color/rgb-to-hsv.htm。我曾经反过来需要它,并为它做了以下功能。

def hsb2rgb(hsb):
    '''
    Transforms a hsb array to the corresponding rgb tuple
    In: hsb = array of three ints (h between 0 and 360, s and v between 0 and 100)
    Out: rgb = array of three ints (between 0 and 255)
    '''
    H = float(hsb[0] / 360.0)
    S = float(hsb[1] / 100.0)
    B = float(hsb[2] / 100.0)

    if (S == 0):
        R = int(round(B * 255))
        G = int(round(B * 255))
        B = int(round(B * 255))
    else:
        var_h = H * 6
        if (var_h == 6):
            var_h = 0  # H must be < 1
        var_i = int(var_h)
        var_1 = B * (1 - S)
        var_2 = B * (1 - S * (var_h - var_i))
        var_3 = B * (1 - S * (1 - (var_h - var_i)))

        if      (var_i == 0):
            var_r = B     ; var_g = var_3 ; var_b = var_1
        elif (var_i == 1):
            var_r = var_2 ; var_g = B     ; var_b = var_1
        elif (var_i == 2):
            var_r = var_1 ; var_g = B     ; var_b = var_3
        elif (var_i == 3):
            var_r = var_1 ; var_g = var_2 ; var_b = B
        elif (var_i == 4):
            var_r = var_3 ; var_g = var_1 ; var_b = B
        else:
            var_r = B     ; var_g = var_1 ; var_b = var_2

        R = int(round(var_r * 255))
        G = int(round(var_g * 255))
        B = int(round(var_b * 255))

    return [R, G, B]