HSVは、六角形の円錐モデルとも呼ばれる、色の直感的な特性に基づいて1978年にARSmithによって作成された色空間です。このモデルのカラーパラメータは、色相(H)、彩度(S)、明度(V)です。HSVは、従来のRGB色空間よりも正確に色を認識でき、計算を単純に保つことができます。
HSV色分解の基本的な手順は、HSV表現の変換、ターゲットしきい値の設定、マスクの設定、およびターゲット色のフィルタリングです。
記事のディレクトリ
1.RGBカラーモデル
RGBカラーモードは業界の色標準であり、赤(R)、緑(G)、青(B)の3つのカラーチャンネルを変更し、それらを重ね合わせることでさまざまな色を取得します。はい、RGBは、赤、緑、青の3つのチャネルを表す色です。この規格には、人間の視覚で認識できるほぼすべての色が含まれており、最も広く使用されているカラーシステムの1つです。
2、HSVカラーモデル
1.カラーモデル
HSVは、六角形の円錐モデルとも呼ばれる、色の直感的な特性に基づいて1978年にARSmithによって作成された色空間です。このモデルのカラーパラメータは、色相(H)、彩度(S)、および明度(V)です。
色相H:角度で測定した値の範囲は、赤から反時計回りに0°〜360°、赤は0°、緑は120°、青は240°です。それらの補色は、黄色が60度、シアンが180度、紫が360度です。
彩度S:彩度Sは、色がスペクトル色にどれだけ近いかを示します。特定のスペクトル色を白と混合した結果として色が表示されます。その中で、スペクトル色の比率が大きいほど、スペクトル色に近い色が高くなり、色の彩度が高くなり、彩度が高くなり、色が暗くなり、明るくなります。スペクトル色の白色光成分は0で、彩度が最も高くなります。通常、値の範囲は0%〜100%で、値が大きいほど色が飽和します。
明るさV:明るさは色の明るさを示します。光源の色の場合、値は発光体の明るさに関連します。オブジェクトの色の場合、この値はオブジェクトの透過率または反射率に関連します。 。通常、値の範囲は0%(黒)から100%(白)です。
2.変換アルゴリズム
(r、g、b)を色の赤、緑、青の座標とし、それらの値は0から1までの実数です。maxをr、g、bの最大値と同等とします。minをこれらの値の最小値に等しくします。HSV空間で(h、s、v)値を見つけるには、h∈[0、360)は角度の色相角、s、v∈[0,1]は
HSVの彩度と明るさです。ユーザーは直感的なカラーモデルだと言われています。純粋な色から始めることができます。つまり、色の角度Hを指定し、V = S = 1とします。次に、それに白黒を追加することで、必要な色を取得できます。黒を増やすとSを変更せずにVを減らすことができ、白を増やすとVを変更せずにSを減らすことができます。たとえば、濃い青を取得するには、V = 0.4 S = 1 H = 210度です。水色を得るには、V = 1 S = 0.4 H = 210度です。
一般的に、人間の目は128の異なる色、130の彩度、23の色合いを区別できます。HSVを表すために16ビットを使用する場合、Hを格納するために7ビット、Sを格納するために4ビット、Vを格納するために5ビットを使用できます。つまり、745または655でニーズを満たすことができます。
HSVは比較的直感的なカラーモデルであるため、Photoshop(PhotoshopではHSBと呼ばれます)などの多くの画像編集ツールで広く使用されていますが、これは照明モデルでの使用には適していないことも決定します。多くのライトハイブリッド計算、光強度計算などは、HSVを使用して直接実装することはできません。
ちなみに、もう1つの直感的なカラーモデルはHSLモデルで、最初の2つのパラメーターはHSVと同じで、Lは明るさを表します。その立体表現は二重ピラミッドです。
各色の具体的な値は次のとおりです:
第三に、マスク
デジタル画像処理におけるマスクの概念は、PCBプレート製造のプロセスから借用されています。半導体製造では、多くのチッププロセスステップでフォトリソグラフィー技術が使用されます。これらのステップで使用されるグラフィック「ネガティブ」はマスクと呼ばれ、その役割は次のとおりです。不透明なパターンテンプレートがチップ上の選択された領域に隠され、その後の腐食または拡散は選択された領域の外側の領域にのみ影響します。
画像マスキングはそれに似ており、選択した画像、グラフィックス、またはオブジェクトを使用して処理済み画像をカバーし、画像処理領域またはプロセスを制御します。
デジタル画像処理では、マスクは次元行列配列であり、多値画像が使用されることもあります。画像マスクは主に次の目的で使用されます
。①関心領域を抽出し、処理する画像に事前に作成された領域を乗算します。関心マスク。関心領域の画像の場合、関心領域内の画像の値は変更されませんが、領域外の画像の値はすべて0です。
②シールド機能。マスクを使用して画像上の特定の領域をシールドし、処理パラメータの処理や計算に関与しないようにします。または、シールドされた領域のみを処理またはカウントします。
③Structural特徴抽出画像におけるマスクと同様の構造的特徴を検出して抽出する類似変数または画像マッチング方法を使用して、。
④特殊な形状の画像の作成。
4、HSV色分解コードの実装(python)
1.ライブラリを紹介します
import numpy as np
import cv2
2.元のビデオをインポートします
cap = cv2.VideoCapture('green.mp4') #打开同一目录下的视频
while(cap.isOpened()):
ret, frame = cap.read() #frame保存视频每一帧
if ret==True: #当读取成功时
cv2.imshow('frame',frame)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
ブラウジングを容易にするために、この記事のすべてのビデオはgif形式に変換されてアップロードされます。
3.元のビデオをhsv色空間に変換します
hsv色空間に変換するには、関数cv2.cvtColor(input_image、flag)を使用する必要があります。
パラメータ | 説明 | 戻り値 | ||||||
---|---|---|---|---|---|---|---|---|
|
|
|
||||||
|
|
変換の種類:
の種類 | 説明 |
---|---|
cv2.COLOR_BGR2GRAY | BGR->グレー |
cv2.COLOR_BGR2RGB | BGR-> RGB |
cv2.COLOR_BGR2HSV | BGR-> HSV |
具体的なコードは次のとおりです。
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
変換後の結果は次のとおりです。
4.マスクを入手する
マスクを計算するには、最初に色のしきい値を決定してから、cv2.inRang関数を使用してマスクを設定し、緑色の部分だけを残す必要があります。4行目のマトリックス展開は、このステップをビデオに視覚化するためのものであり、実際の操作では必要ありません。
lower = np.array([35, 43, 46])
upper = np.array([77, 255, 255]) #设定绿色的hsv阈值
mask2 = cv2.inRange(hsv, lower, upper)#设置掩模 只保留绿色部分
mask=np.stack([mask2] * 3, axis=2) #矩阵拓展
得られたマスク結果は次のとおりです。
5.ターゲットカラーをフィルタリングします
マスクを取得したら、cv2.bitwise_and関数を使用して、マスクを元の画像と「AND」し、緑色をフィルターで除去して、最終結果を取得します。
res = cv2.bitwise_and(frame, frame, mask = mask2)
フィルタリングされた結果は次のとおりです。
6.完全なコード
import cv2
cap = cv2.VideoCapture('green.mp4') #打开原视频
fourcc = cv2.VideoWriter_fourcc(*'mp4v') #设置输出视频格式
fps =cap.get(cv2.CAP_PROP_FPS) #设置输出视频帧数
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) #视频尺寸
out2 = cv2.VideoWriter('green_hsv.mp4',fourcc, fps, size) #设置输出hsv视频
out3 = cv2.VideoWriter('green_mask.mp4',fourcc, fps, size) #设置输出mask视频
out4 = cv2.VideoWriter('green_res.mp4',fourcc, fps, size) #设置输出最终过滤视频
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) #rgb通道难以分离颜色 需要先转化到hsv色彩空间
lower = np.array([35, 43, 46])
upper = np.array([77, 255, 255]) #设定绿色的hsv阈值
mask2 = cv2.inRange(hsv, lower, upper)#设置掩模 只保留绿色部分
res = cv2.bitwise_and(frame, frame, mask = mask2 #利用掩模与原图像做“与”操作 过滤出绿色
mask=np.stack([mask2] * 3, axis=2) #mask矩阵拓展
out2.write(hsv) #保存hsv视频到本地
out3.write(mask) #保存mask视频到本地
out4.write(res) #保存最终视频到本地
cv2.imshow('frame',frame) #显示原视频
cv2.imshow('hsv',hsv) #显示hsv视频
cv2.imshow('mask',mask) #显示mask视频
cv2.imshow('res',res) #显示最终视频
if cv2.waitKey(10) & 0xFF == ord('q'):
break
else:
break
cap.release()
out.release()
out2.release()
out3.release()
out4.release()
cv2.destroyAllWindows()
5、ターゲット追跡
hsv色分解により、ビデオ内の緑色のオブジェクトを識別できるため、このメソッドをさらに使用して、ビデオ内の緑色のオブジェクトを追跡できます。具体的なアイデアは次のとおりです
。1。モルフォロジーでオープン操作を使用して、ビデオのグリーンノイズを除去します。詳細な計算を開きます。
2.マスクによって取得された2次元(0-255)行列に従って、オブジェクトの範囲が取得されます。
3.オブジェクトのスコープに応じて長方形のボックスを描画します。
関連するコードは次のとおりです。
kernel = np.ones((10,10), np.uint8) #设置开运算所需核
opening = cv2.morphologyEx(mask2, cv2.MORPH_OPEN, kernel) # 对得到的mask进行开运算
rectangle = np.where(opening == 255) #找出开运算后矩阵中为255的部分,即物体范围
cv2.rectangle(frame, (min(rectangle[1]), min(rectangle[0])), (max(rectangle[1]), max(rectangle[0])), (0, 0, 255), 3) #根据每一帧中物体的左上角坐标以及右下角坐标绘制矩形框
最終結果は次のとおりです。