我正在尝试自动化某些要转移到数字框架的图像的增强。我有调整大小的代码,将图像的最小(最小细节)角添加到日期/时间,并粘贴成对的肖像图像,以避免在框架的41:20低分辨率屏幕中显示单个肖像。

我已经为那些照明不太好的图片实现了一个亮度拉伸的过滤器,使用 colorsys.rgb_to_hsv 功能以计算H,S,V频段,在V ONE上操作,然后转换回RGB,然后再保存JPEG在数字帧中。显然,转换需要大量时间,甚至使用 itertools 技巧;我设法使用 psyco.

但是,我注意到了PIL的例子 Image.convert RGB可以转换为 XYZ色彩空间 使用4×4矩阵作为第二个参数 convert 方法,我不得不想知道:

如何使用自定义矩阵中的RGB转换为HSV(然后将HSV返回RGB) convert 方法通话? (在这种情况下,较小的四舍五入错误并不重要,因此我不介意每个乐队都将以0…255个整数表示)

先感谢您。

有帮助吗?

解决方案

尽管我已经看到参考文献[1]声称HSV颜色空间是RGB的线性转换,这似乎暗示它可以使用矩阵来完成,但我无法为自己找到或确定自己的矩阵看起来像。从某种意义上说,这并没有真正根据我所看到的所有[类似]非矩阵程序实现的方式感到惊讶 线性。

无论如何,在研究这一点时,我遇到了前SGI研究员的[有些过时的]文章 保罗·海伯利(Paul Haeberli)标题为“在线计算机图形学笔记本” 图像处理的矩阵操作 它描述了如何使用4x4矩阵进行许多不同的颜色转换,这可能会对您有所帮助。给出的所有示例都直接在RGB颜色图像上运行,就像几何矩阵变换一样,它们的任何序列都可以使用串联组合到单个矩阵中。

希望这可以帮助。


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

2.7.3 HSL(色相饱和度和轻度)

这代表了许多相似的颜色空间,替代名称包括HSI(强度),HSV(值),HCI(Chroma / Colourness),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]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top