フロントコンテンツ
RGB 色空間は一般的な色空間ですが、GRAY 色空間や HSV 色空間など、さまざまな角度から色を理解できる色空間もあります。
数字の 10 に似て、2 進数、8 進数、または 16 進数で表現でき、さまざまなルールで表現できます。エラーはありませんが、各基数の計算は各基数のルールに従って実行する必要があります。
色空間についても同様で、各色空間は相互に変換でき、異なる基底間での類推変換も可能です。
色空間の基本
灰色の色空間
画像を RGB 色空間から GRAY 色空間 (グレースケール画像) に変換する場合、標準の変換式は次のとおりです: GRAY=0.299 * R + 0.587 * G + 0.114 * B
場合によっては、GRAY = ( R + G + B ) / 3 という変換を計算する方が簡単な場合もあります。
GRAY 色空間が BGR 色空間に変換されると、すべてのチャンネルは同じになります: B = G = R = GRAY
HSV色空間
RGB は、3 つの原色の異なる比率によってさまざまな色に混合されます。実際には、HSV 色空間という直観的な方法で色を認識するのが一般的です。
HSV 色空間には色相 H、彩度 S、明度 V が含まれます
- Hue H(色相)
色相とは光の色です。太陽光は、赤、オレンジ、黄、緑、青、青、紫などのさまざまな光が含まれた混合光であることがわかっていますが、これらの光は波長が異なるため、異なる色に見えます。色合い。
HSV 色空間では、色相 H の値の範囲は [0,360]、各ピクセルの値の範囲は [0.255] です。色相を [0,360] から [0,255] にマッピングするために、OpenCV は色相を次のように除算します。 2、取得された値は [0,180] で、8 ビット 2 進数の格納および表現範囲に適応します。
いくつかの代表的な色に対応する値は次のとおりです。
色 |
調子 |
OpenCV内の値 |
赤 |
0 |
0 |
黄色 |
60 |
30 |
緑 |
120 |
60 |
青 |
180 |
90 |
青 |
240 |
120 |
赤紫色 |
300 |
150 |
色相の使用の簡単な説明: HSV 画像では、H チャネル 120 の値に対応するピクセルは青です。
- 彩度S(彩度)
彩度は色の鮮やかさを指し、色の相対的な純度として表されます。彩度は色の中のグレーの割合に依存し、グレーが多いほど彩度は低くなります。色にグレーが含まれていない場合は、この時点で純粋な色として表示されます。
色の彩度が非常に低い(グレーが多すぎる)場合、計算された色相(明るい色)は正確ではなく、この時点では色の情報はなく、グレーの情報のみが存在します。
彩度の値の範囲は[0,1]で、彩度が0の場合はグレースケールのみ、彩度が1の場合は純色です。
8 ビット ビットマップで表示するには、彩度も [0,1] を [0,255] にマッピングする必要があります。
- 明度V(値)
明るさとは、人間の目で認識される色の明るさを指し、人間の目で認識される光の明るさと暗さを反映します。
無彩色(黒、白、グレー)は、白の明度が最も高く、黒の明度が最も低く、白と黒の間に明度の異なるグレーが存在します。
カラー画像の場合、輝度が高いほど画像は明るくなり、その逆も同様です。
明るさの値の範囲は [0,1] で、OpenCV では [0,255] にもマッピングされます。
例えば:
色相=0 彩度=1 明度=1の場合、人間の目に見える色は赤となり、より明るい色になります。
色相=120 彩度=0.3 明度=0.4、人間の目に見える色は薄緑色と暗めです。
色空間変換
OpenCV は、異なる色空間の変換を実現するメソッドを提供します
dst = cv2.cvtColor( src , コード [,dstCn] )
dst : 変換された出力イメージは、元のイメージと同じデータ型と深度を持ちます。
src : 元の入力画像
code : カラースペース変換コード。このパラメータは OpenCV にどのカラースペースからどのカラースペースに変換するかを指示します。具体的な長さは cv2.COLOR_XXX2YYY です。
dstCn : 対象画像のチャンネル数
マッピング操作によって生じる丸めは各空間の変換プロセスで避けられないため、色空間を前後に変換するプロセスは正確ではなく、可逆的ではありません。
例 - 肌の色を抽出する
HSV色空間における肌色の範囲に応じて、肌色を含む部分を抽出できます
- 色相値 [0,33]
- 彩度[10,255]
- 明度値 [80,255]
具体的な実装は以下の通りです。
import cv2 as cv
import numpy as np
img = cv.imread("x.png")
# BGR转为HSV
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
print(hsv) # HSV色彩空间的数据 二维数组的[H S V]或者三维数组
min_HSV = np.array([0, 10, 80], dtype="uint8") # [0 10 80]
max_HSV = np.array([33, 255, 255], dtype="uint8") # [33 255 255]
# cv2.inRange(src,min,max)低于min或高于max的值置为0 在min和max范围内的值置为255
mask = cv.inRange(hsv, min_HSV, max_HSV)
print(mask) # 掩模嘛,就是个二维数组
result = cv.bitwise_and(img, img, mask=mask) # 2个img这个我看的有点懵一开始,自己与自己,等于自己,就是图像在掩模作用范围内做算法
cv.imshow("img", img)
cv.imshow("mask", mask)
cv.imshow("result", result)
cv.waitKey()
cv.destroyAllWindows()
操作は次のとおりです (当初は lena のカラー マップを使用したかったのですが、lena マップ全体が広くて黄色が混ざるため、効果はあまり良くありません)。