使用PIL进行RGB到HSV的转换

我正在尝试自动增强一些要转移到数字帧的图像。我有适当的代码调整大小,为图像的最不重要(最少细节)角添加日期/时间,并将成对的肖像图像粘贴在一起,以避免在帧的41:20低分辨率屏幕中显示单个肖像。 我已经为那些光线不太好的照片实现了亮度拉伸滤镜,使用
colorsys.rgb_to_hsv
函数计算H,S,V波段,在V 1上运行,然后在保存JPEG之前转换回RGB数码相框。显然,即使使用
itertools
技巧,转换也需要很长时间;我设法用ѭ2改进了一些东西。 但是,我注意到PIL
Image.convert
的一个例子,其中RGB可以使用4×4矩阵转换为XYZ颜色空间作为
convert
方法的第二个参数,我想知道: 如何在
convert
方法调用中使用自定义矩阵将RGB转换为HSV(然后将HSV转换回RGB)? (在这种情况下,小的舍入误差并不重要,所以我不介意每个波段将表示为一系列0 ... 255个整数) 先感谢您。     
已邀请:
虽然我已经看到声称HSV色彩空间是RGB的线性变换的参考文献[1],这似乎暗示它可以用矩阵完成,但我一直无法找到或确定自己这样的矩阵是什么看起来像。在某种程度上,基于我所见过的所有[类似]非矩阵程序实现,这并不让我感到惊讶 - 它们的方式看起来并不是线性的。 无论如何,在调查这篇文章时,我遇到了前SGI研究员Paul Haeberli的在线计算机图形笔记本[有点过时]的文章,名为Matrix Operations for Image Processing,它描述了如何使用4x4矩阵进行多种不同的颜色转换,这可能对您有所帮助。给出的所有示例都直接在RGB彩色图像上操作,并且像几何矩阵变换一样,它们的任何序列可以使用串联组合成单个矩阵。 希望这可以帮助。 [1]:色彩空间转换< http://www.poynton.com/PDFs/coloureq.pdf>:   2.7.3 HSL(色调饱和度和亮度)      这代表了丰富的类似   色彩空间,替代名称   包括HSI(强度),HSV(值),   HCI(色度/色彩),HVC,   TSD(色调饱和度和黑暗度)等   大多数这些色彩空间都是   RGB的线性变换和   因此设备依赖和   非线性的。他们的优势在于   非常直观的方式   指定颜色。这很容易   选择所需的色调,然后选择   通过调整稍微修改它   它的饱和度和强度。     
可以在此处找到将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]
    

要回复问题请先登录注册