PILを使用したRGBからHSVへの変換
-
13-10-2019 - |
質問
デジタルフレームに転送されるいくつかの画像の強化を自動化しようとしています。サイズを変更し、画像の最も重要な(最小詳細)コーナーに日付/時刻を追加し、フレームの41:20低解像度画面に単一のポートレートを表示しないように、ポートレート画像のペアを一緒にペアで貼り付けます。
照明がそれほど良くない写真の輝度を伸ばすフィルターを実装しました。 colorsys.rgb_to_hsv
H、S、Vバンドを計算し、V ONEで動作し、RGBに戻り、デジタルフレームにJPEGを保存する前に機能します。明らかに、変換には多くの時間がかかります。 itertools
トリック;私はなんとか物事を改善することができました psyco
.
しかし、私はPILの例に気付きました Image.convert
RGBを変換できる場所 XYZカラースペース 4×4マトリックスを2番目の引数として使用する convert
方法、そして私は疑問に思うようになりました:
RGBをHSVに変換するにはどうすればよいですか(およびHSVをRGBに戻します)。 convert
メソッドコール? (この場合、マイナーな丸めエラーは重要ではないので、各バンドが0のシリーズとして表現されることを気にしません…255整数)
前もって感謝します。
解決
HSVのカラースペースがRGBからの線形変換であると主張する参考文献[1]を見てきましたが、これはマトリックスで行うことができることを暗示しているように思われますが、そのようなマトリックスを自分で見つけたり決定することができませんでした見えるでしょう。ある意味では、これは私が見たすべての[類似の]非マトリックスの手続き的実装に基づいて私を本当に驚かせません - 彼らがそれを進める方法はそうではありません 見る 線形。
とにかく、これを見ている間、私は元SGI研究者の[やや時代遅れの]記事に出くわしました ポール・ヘベルリオンラインコンピューターグラフィックスノートブックというタイトル 画像処理のためのマトリックス操作 これは、4x4マトリックスを使用してさまざまな色変換を行う方法を説明しています。指定されたすべての例は、RGBカラー画像で直接動作し、幾何学的マトリックス変換と同様に、それらの任意のシーケンスを連結を使用して単一のマトリックスに結合することができます。
お役に立てれば。
[1]: カラースペース変換 <http://www.poynton.com/pdfs/coloureq.pdf>:
2.7.3 HSL(色相の飽和と軽さ)
これは、豊富な同様のカラースペースを表し、代替名にはHSI(強度)、HSV(値)、HCI(クロマ /カラーフルネス)、HVC、TSD(Hue飽和と暗闇)などが含まれます。 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]