簡體   English   中英

使用PIL將RGB轉換為HSV

[英]RGB to HSV conversion using PIL

我正在嘗試自動增強一些要轉移到數碼相框的圖像。 我有適當的代碼可以調整大小,在圖像的最低有效(最小細節)角添加日期/時間,並將肖像圖像對粘貼在一起,以避免在幀的41:20低分辨率屏幕中顯示單個肖像。

對於colorsys.rgb_to_hsv不太好的圖片,我已經實現了亮度拉伸濾鏡,使用colorsys.rgb_to_hsv函數計算H,S,V波段,在V上進行運算,然后再轉換回RGB,然后再保存數碼相框中的JPEG。 顯然,即使使用itertools技巧,轉換也要花費很多時間。 我設法使用psyco進行了改進。

但是,我注意到了一個PIL Image.convert的示例,在該示例中,可以使用4×4矩陣作為convert方法的第二個參數convert RGB轉換為XYZ顏色空間

如何在convert方法調用中使用自定義矩陣將RGB轉換為HSV(然后再將HSV返回RGB)? (在這種情況下,較小的舍入誤差並不重要,因此我不介意每個波段都將表示為一系列0…255的整數)

先感謝您。

盡管我已經看到參考文獻[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(色相飽和度和亮度)

這代表了大量相似的色彩空間,替代名稱包括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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM