このチュートリアルでは、正式に学習の基本について説明します。OpenCV画像処理の最も重要な部分は、画像の色空間です。以前に画像のグレースケールの例を見てきましたが、これはその1つにすぎません。一種。
色空間
色/色空間(英語:色空間)は色の編成です。色空間と物理デバイスのテストを利用して、色の固定されたアナログ表現とデジタル表現を得ることができます。色空間は、いくつかの色を任意に選択するだけで定義できます。たとえば、Pantoneシステムは、特定の色のセットをサンプルとして取り、各色の名前とコードを定義します。これは、Adobe RGBなどの厳密な数学的定義に基づくこともできます。 、SRGB。
赤、黄、青の3つの原色を使用して、ペイント時に異なる色を生成できることを多くの人が知っており、これらの色が色空間を定義します。マゼンタの量をX座標軸、シアンの量をY座標軸、黄色の量をZ座標軸として定義します。これにより、3次元空間が得られ、この3次元空間内で可能な各色は一意になります。場所の。
ただし、これは唯一の色空間ではありません。たとえば、コンピュータモニタに色を表示する場合、通常はRGB(赤、緑、青)色空間で定義されます。これは、同じ色を生成するもう1つの方法です。赤、緑、青はXとして扱われ、 YおよびZ座標軸。同じ色を生成するもう1つの方法は、色相(X軸)、彩度(色度)(Y軸)、明度(Z軸)を使用することで、この方法はHSB色空間と呼ばれます。さらに、他にも多くの色空間があり、その多くは3次元(X、Y、Z)で表現できますが、多かれ少なかれこの方法で次元を表現できますが、一部はまったくこの方法で表現できません。
私たちの生活の中で目にするほとんどのカラー写真はRGBタイプですが、画像処理を実行するときは、グレースケール、バイナリ、HSV、HSI、およびその他のカラーシステムを使用する必要があります。OpenCVはこれらを実現するためにcvtColor()関数を提供します特徴。最初にcvtColor関数の定義を確認します。
cvtColor(InputArray src、OutputArray dst、int code、int dstCn = 0);
。InputArray src:入力画像は、色空間に変換される元の画像であり、Matクラスにすることができます。
。OutputArray dst:出力画像は、色空間変換後の画像、またはMatクラスを格納するためのものです
。intコード:変換のコードまたはロゴ、つまり、ここで、どのフォーマットの画像がどのフォーマットの画像に変換されるかを決定します。これについては後で詳しく説明します
。int dstCn = 0:ターゲットイメージチャネルの数。値が0の場合、srcとコードによって決定されます。
関数の機能は、画像をある色空間から別の色空間に変換することですが、RGBから他のタイプに変換するときは、画像のカラーチャネルを明確に示す必要があります。前述したように、OpenCVでは、そのデフォルトの色システム構成はRGBではなくBGRです。したがって、24ビットカラーイメージの場合、最初の8ビットは青、中央の8ビットは緑、最後の8ビットは赤です。一般的なR、G、Bチャネルの値の範囲は次のとおりです。
。0-255:CV_8Uタイプの画像
。0-65535:CV_16Uタイプの画像
。0-1:CV_32Fタイプの画像
このチュートリアルでは、グレースケールやHSV空間変換など、いくつかの重要な色空間変換方法のみを学習します。まずコードを見てみましょう:
view plaincopy to clipboardprint?
import cv2
img = cv2.imread("cat.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
hls = cv2.cvtColor(img, cv2.COLOR_BGR2HLS)
LAB = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
LUV = cv2.cvtColor(img, cv2.COLOR_BGR2LUV)
cv2.imshow("gray", gray)
cv2.imshow("hsv", hsv)
cv2.imshow("hls", hls)
cv2.imshow("LAB", LAB)
cv2.imshow("LUV", LUV)
cv2.waitKey(0)
cv2.destroyAllWindows()
効果
を見てみましょう。色の異なる6匹の猫を見ました。もちろん、OpenCV内には150を超える色空間変換があります。ここでは1つずつ示すことはできません。最も重要な2つであるグレースケールとHSV、グレースケール、詳細は言う必要はありません。主にHSVを見てください。HSVは通常、カラートラッキングで使用され、主要なターゲットトラッキング方法と見なすことができます。BGRよりも特定の色のオブジェクトを追跡する方が簡単で、指定された色をセグメント化するためによく使用されます。オブジェクト。
HSVがカラー画像を表現する方法は、3つの部分で構成されています。
・色相(色相、色相)
・彩度(彩度、色純度)
・値(明度)
次の円柱を使用してHSV色空間を表します。円柱の断面は極座標系と見なすことができます。Hは極座標の極角で表され、Sは極座標での極軸の長さで表され、Vは円柱の中心軸で表されます。高さ表現。
色相は角度で測定され、値の範囲は0〜360°です。これは、色情報、つまりスペクトル色の位置を表します。次のように表現されます:
カラーサークルのすべての色は、赤から始まり反時計回りに回転するスペクトル上の色です。Hue= 0は赤、Hue = 120は緑、Hue = 240は青などを意味します。
GRBでは、色は3つの値で決定されます。たとえば、黄色は(255,255,0)で、HSVでは、黄色は1つの値(色相= 60)だけで決定されます。
HSVシリンダーの半分の断面(色相= 60):
水平方向は彩度を表し、彩度は色がスペクトル色にどれだけ近いかを表します。彩度が高いほど、色は暗く、スペクトルに近く、彩度が低いほど、色は明るく、白に近くなります。彩度0は、純粋な白を意味します。値の範囲は0〜100%で、値が大きいほど色が飽和します。
縦方向は明度を示し、色空間での色の明度を決定します。明度が高いほど色が明るくなり、範囲は0〜100%です。明度0は、純粋な黒を意味します(この時点で色は最も暗い)。
次のように理解できます。
特定の色相の場合、彩度が減少します。つまり、白が分光色に追加され、分光色の比率も減少します。彩度は0に減少します。これは、分光色の比率がゼロであることを意味し、結果として色全体になります白く見える。
明度が減少する、つまり、分光色に黒が追加され、分光色の比率も減少します。明度は0に減少します。これは、分光色の比率がゼロであるため、色全体が黒に見えることを意味します。
HSVは、私たちにとって比較的直感的なカラーモデルです。単色を簡単に取得できます。つまり、色角度Hを指定し、V = S = 1にしてから、それに白黒を追加して、必要な色を取得します。黒を増やすとSを変更せずにVを減らすことができ、白を増やすとVを変更せずにSを減らすことができます。たとえば、濃い青を取得するには、V = 0.4 S = 1 H = 240度です。水色にするには、V = 1 S = 0.4 H = 240度です。
HSVのストレッチコントラスト拡張は、SとVの2つのコンポーネントを正規化することであり、Hは変更されません。
注:OpenCVのHSVの3つのコンポーネントの範囲は次のとおりです。
・H = [0,179]
・S = [0,255]
・V = [0.255]
ターゲットカラートラッキング
前述のように、HSV色空間に従ってカラートラッキングが実装されていますが、最初にHSV値を取得するには、BGR値に対して色空間変換を実行する必要があります。
特定の色のオブジェクトを識別するためには、その色に対応するHSV値を取得することが重要です。ここに変換テーブルを示します。
これらのデータ範囲をコードで実装するには、OpenCVの関数を知る必要があります。
cv2。inRange(InputArray src、InputArray lowerb、InputArray upperb、OutputArray dst)、各パラメーターの分析:
1. srcは入力配列
2.lowerbは、このチュートリアルの上記の表で使用されている最小値lowerbを含む最小値の配列またはコンポーネントです。
3. upperbは、このチュートリアルの上記の表で使用されている最大値であるupperbを含む最大値の配列またはコンポーネントです。
4.出力配列、サイズ、チャネル数はsrcと同じで、タイプはCV_8Vです。
カメラを開いて緑色のオブジェクトの動きを認識するために使用されるコードを見てみましょう。
view plaincopy to clipboardprint?
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_black = np.array([35, 43, 46])
upper_black= np.array([77, 255, 255])
mask = cv2.inRange(hsv, lower_black, upper_black)
res = cv2.bitwise_and(frame, frame, mask=mask)
cv2.imshow('frame', frame)
cv2.imshow('mask', mask)
cv2.imshow('res', res)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
効果を見てみましょう:
完璧、HSVを使用してオブジェクトを追跡できます。最も重要なことは、値の範囲を調整することです。上記の表に従って値を実行することは、まったく問題ありません。
記事の概要ページを確認してくださいhttps://blog.csdn.net/weixin_44237705/article/details/107864965
openvinoの技術情報はグループで交換できます〜