利用PIL实现RGB到HSV的转换

2024-05-17 19:44:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试自动增强一些图像,这些图像将被传输到数字帧。我已经准备好了调整大小的代码,将日期/时间添加到图像的最不重要(最不详细)的角落,并将成对的肖像图像粘贴在一起,以避免在帧的41:20低分辨率屏幕中显示单个肖像。

我已经为那些光线不太好的图片实现了亮度拉伸过滤器,使用^{}函数计算H,S,V波段,对V波段进行操作,然后在数字帧中保存JPEG之前转换回RGB。显然,转换需要很多时间,甚至使用^{}技巧;我设法使用^{}改进了一些东西。

然而,我注意到PIL^{}的一个例子,其中RGB可以使用4×4矩阵作为convert方法的第二个参数转换为XYZ color space,我想知道:

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

提前谢谢你。


Tags: 方法代码图像convert屏幕粘贴波段时间
2条回答

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

总之,在研究这个问题时,我在前SGI研究员Paul Haeberli的在线计算机图形学笔记本上看到了一篇[有些过时的]文章,题为Matrix Operations for Image Processing,它描述了如何使用4x4矩阵进行多种不同的颜色转换,这可能会对您有所帮助。所有给出的例子都直接在RGB彩色图像上操作,并且,像几何矩阵变换一样,它们的任何序列都可以通过级联组合成单个矩阵。

希望这有帮助。


[1] :颜色空间转换<;http://www.poynton.com/PDFs/coloureq.pdf>;:

2.7.3 HSL (Hue Saturation and Lightness)

This represents a wealth of similar colour spaces, alternative names include HSI (intensity), HSV (value), HCI (chroma / colourfulness), HVC, TSD (hue saturation and darkness) etc. Most of these colour spaces are linear transforms from RGB and are therefore device dependent and non–linear. Their advantage lies in the extremely intuitive manner of specifying colour. It is very easy to select a desired hue and to then modify it slightly by adjustment of its saturation and intensity.

将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]

相关问题 更多 >