コンピュータビジョン(2)-HSV色分解とターゲット追跡

  HSVは、六角形の円錐モデルとも呼ばれる、色の直感的な特性に基づいて1978年にARSmithによって作成された色空間です。このモデルのカラーパラメータは、色相(H)、彩度(S)、明度(V)です。HSVは、従来のRGB色空間よりも正確に色を認識でき、計算を単純に保つことができます。
  HSV色分解の基本的な手順は、HSV表現の変換、ターゲットしきい値の設定、マスクの設定、およびターゲット色のフィルタリングです。



1.RGBカラーモデル

  RGBカラーモードは業界の色標準であり、赤(R)、緑(G)、青(B)の3つのカラーチャンネルを変更し、それらを重ね合わせることでさまざまな色を取得します。はい、RGBは、赤、緑、青の3つのチャネルを表す色です。この規格には、人間の視覚で認識できるほぼすべての色が含まれており、最も広く使用されているカラーシステムの1つです。

RGB

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]は
h計算
s計算
v計算
  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)を使用する必要があります。

パラメータ 説明 戻り値
input_image
変換する必要のある画像
色空間変換後の画像マトリックス
国旗
変換の種類

変換の種類:

の種類 説明
cv2.COLOR_BGR2GRAY BGR->グレー
cv2.COLOR_BGR2RGB BGR-> RGB
cv2.COLOR_BGR2HSV BGR-> HSV

具体的なコードは次のとおりです。

hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 

変換後の結果は次のとおりです。
hsv

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) #根据每一帧中物体的左上角坐标以及右下角坐标绘制矩形框

最終結果は次のとおりです。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_41433002/article/details/115309090