第 4 章: 色空間タイプの変換

色空間は、色空間、色空間、カラーモデル、カラーシステム、カラーモデル、カラーモデルなどと呼ばれます。

一般的な色空間タイプは次のとおりです。

  • RGB 色空間 (最も一般的)
  • GRAY 色空間 (グレースケール画像)
  • XYZ色空間
  • YCrCb色空間
  • HSV色空間
  • HLS色空間
  • CIEL* a* b* 色空間
  • CIEL *u*v* 色空間
  • ベイヤー色空間

各色空間には問題を扱うフィールドがあるため、特定の問題に対処する場合は、色空間タイプの変換を使用する必要があります。

1. 色空間の基本:

1. グレー色空間:

GRAY (グレースケール画像) は通常、256 グレー レベルを持ち、ピクセル値の範囲は [0, 255] である 8 ビット グレースケール画像を指します。画像を RGB 色空間から GRAY 色空間に変換する場合、処理は次のようになります。

  • グレー = 0.299 * R + 0.587 * G + 0.114 * B

上記の変換式は標準的な変換式であり、OpenCVで使用されている変換方法です。場合によっては、次のように単純化することもできます。

  • $GRAY = \cfrac { R + G +B }{ 3 } $

画像を GRAY 色空間から RGB 色空間に変換すると、最終的にすべてのチャンネル値は同じになり、処理方法は次のようになります。

  • R = グレー
  • G = グレー
  • B = グレー

2.XYZ色空間

XYZ 色空間は CIE によって定義されており、RGB 色空間と相互に変換できる計算が容易な色空間です。

  • RGB 色空間を XYZ 色空間に変換します。

画像-20211006132125441

  • XYZ色空間をRGB色空間に変換する

画像-20211006132148911

3. YCrCb色空間

人間の視覚システム (HSV) は、明るさよりも色に対してあまり敏感ではありません。従来の RGB 色空間では、RGB の三原色は同じ重要性を持ちますが、明るさの情報は無視されます。

YCrCb 色空間では、Y は光源の明るさを表し、色情報は Cr と Cb に格納されます。Cr は赤の成分情報を表し、Cb は青の成分情報を表します。

輝度は、照明の強度の加重合計として計算され、色がどの程度明るいか暗いかに関する情報を提供します。RGB 光源では、緑色成分の影響が最も大きく、青色成分の影響が最も小さくなります。

  • RGB 色空間を YCrCb 色空間に変換します。

    • Y = 0.299 * R + 0.578 * G + 0.114 * B
    • Cr = ( R - Y ) × 0.713 + デルタ
    • Cb = (B - Y ) × 0.546 + デルタ

    式のデルタの値は次のとおりです: { 128、8 ビット画像 32768、16 ビット画像 0.5、単精度画像 \begin{cases} 128、\quad 8-bit image\\ 32768、\quad 16-bit image\\ 0.5, \quad 単精度画像\end{cases}1 2 8 8ビット画像3 2 7 6 8 1 6ビット画像0 5 単精度画像_

  • YCrCb 色空間を RGB 色空間に変換します。

    • R = Y + 1.403 * (Cr - デルタ)
    • G = Y - 0.714 * (Cr - デルタ) - 0.344 * (Cb - デルタ)
    • B = Y + 1.733 * (Cr - デルタ)

    式中のデルタの値は、上記の式中のデルタの値と同じです。

3. HSV色空間

RGBはハードウェアの観点から提案されたカラーモデルであり、人間の目とのマッチングの過程で多少の差異が生じる場合があります。しかし、HSV 色空間は異なり、視覚認識のためのカラー モデルです。心理学と視覚の観点から、HSV 色空間は、人間の目の色知覚には主に色相、彩度、明度の 3 つの要素が含まれていると指摘しています。色相は光の色を指し、彩度は色の深さを指します。 . 人間の目が感じる光の明るさや明るさ。

  • 色相: 色相は混合スペクトル内の光の主な波長に関連しており、たとえば「赤、オレンジ、黄、緑、青、紫」はそれぞれ異なる色相を表します。波長の観点から考えると、光の波長の違いは異なる色に見え、実際には色相の違いを反映します。
  • 彩度: 相対的な純度、つまり色が白色光とどの程度混ざるかを指します。純粋な基本色は完全に飽和していますが、マゼンタ (赤と白) やラベンダー (紫と白) などの色は飽和度が低く、彩度は追加される白色光の量に反比例します。
  • 明るさ: 人間の目で認識される光の明るさを反映し、オブジェクトの反射率に関係します。色については、白を多くすると輝度が高くなり、黒を多くすると輝度が低くなります。

実装面では、物理空間の色を円周上に配置し、角度が異なると異なる色を表現します。したがって、色相の値を調整することでさまざまな色を選択できます。色相の値の範囲は [0, 360] です。色相が異なる値を取ると、表現される色も異なり、2 つの角度の間の角度が 2 つの色の間の遷移色に対応します。

画像-20211009104245556

彩度は比例値であり、範囲は [0, 1]、具体的には、選択した色の純度の値と色の最大純度の値の間の比率です。彩度が 0 の場合は、グレースケールのみになります。Brightness は色の明るさを示し、値の範囲も [0, 1] です。

HSV カラー モデルでは、色の選択がより直感的になります。たとえば、値が「色相=0、彩度=1、明度=1」の場合、現在の色は濃い赤であり、より明るい色になります。値が「色相=120、彩度=0.3、明度=0.4」の場合、現在の色は薄緑色で、それよりも暗い色です。

RGB 色空間から HSV 色空間に変換する前に、RGB 色空間の値を [0, 1] に変換して処理する必要があります。具体的な処理方法は次のとおりです。

画像-20211009105224843

計算結果が H<0 になる場合があります。この場合は、次のように H をさらに計算する必要があります。

H = { H + 360 , H < 360 H , (その他のケース) H = \begin{cases} H + 360, \quad H<360 \\ H, \quad (その他のケース) \end{cases}H={ H+3 6 0 H<3 6 0H (その他の場合)

それは上記の式から知ることができます。

  • S ∈ [ 0 , 1 ] S \in [0, 1]S[ 0 ,1 ]
  • V ∈ [ 0 , 1 ] V \in [0, 1]V[ 0 ,1 ]
  • H ∈ [ 0 , 360 ] H \in [0, 360]H[ 0 ,3 6 0 ]

4. HLS色空間

HLS 色空間には、色相 H (色相)、明るさ/明度 L (明度)、彩度 S (彩度) の 3 つの要素が含まれています。HLS 色空間が「明るさ/明度 L (明るさ)」「明るさ(値)」。

  • 色相: 人間の目が認識できる色を示します。HLS モデルでは、すべての色は平らな色相環上に分布します。色相環全体は 360 度の中心角であり、異なる角度は異なる色を表します。
  • 明るさ/明るさ: 色の明暗の変化を制御するために使用され、その値の範囲も [0,1] です。物体の表面からの光の反射量を明度・明るさの大小で測定します。明るさ/明るさは目が色を認識するのに非常に重要です。色付きの物体が光が強すぎるか、または暗すぎる場所にあると、目は物体の色を正確に認識できないからです。
  • 彩度: 同じ色相および同じ明度/明るさの下での色純度の変化を表すには、[0,1] の値を使用します。彩度の値が大きいほど色の純度が高く、色が明るくなり、逆に彩度の値が小さいほど色の純度が低くなり、色が暗くなります。この属性は通常、濃い緑、薄い緑などの色の深さを示すために使用されます。

5. CIEL*a*b*色空間

CIEL * a * b色空間は均一色空間モデルであり、視覚認識のための色モデルです。均一な視覚知覚の観点から、人が知覚する 2 つの色の違いの程度は、色空間における 2 つの色の間の距離に比例するはずです。色空間において、人間が観察する 2 つの色の違いの程度が、色空間内の 2 つの色の対応点間のユークリッド距離に比例する場合、その色空間は均一色空間と呼ばれます。
CIEL * a * b色空間の L コンポーネントはピクセルの明るさを表すために使用され、値の範囲は [0,100]、つまり純粋な黒から純粋な白までを意味し、a * コンポーネントは赤からの範囲を表しますから緑まで、値の範囲は [-127,127] です; b * コンポーネントは黄色から青までの範囲を表し、値の範囲は [-127,127] です。
RGB 色空間から CIEL * a * b * 色空間に変換する前に、処理前に RGB 色空間の値を [0,1] に変換する必要があります。
CIEL * a * b * 色空間は CIE の XYZ 色空間に基づいて開発されているため、特定の処理では、まず RGB を XYZ 色空間に変換してから、CIEL a * b * 色空間に変換する必要があり
ます空。具体的な実装方法は次のとおりです。

画像-20211009111854298

式では次のようになります。

f ( t ) = { t 1 3 , t > 0.0008856 7.787 t + 16 116 、その他の場合 f(t) = \begin{cases} t^\cfrac { 1 }{ 3 }, \quad t > 0.0008856 \\ 7.787 t + \cfrac { 16 }{ 116 }, \quad その他のケース\end{ケース}f ( t )=t31t>0 0 0 0 8 8 5 67 8 7 t+1 1 61 6その他の状況

delta = { 128 , 8 ビット イメージ 0 , 単精度イメージ delta = \begin{cases} 128, \quad 8 ビット イメージ \\ 0, \quad 単精度イメージ \end{cases}デルタ_ _ _ _={ 1 2 8 8ビット画像0 単精度画像_

結果の各値の値の範囲は次のとおりです。

  • L ∈ [ 0 , 100 ] L \in [0, 100]L[ 0 ,1 0 0 ]
  • a ∈ [ − 127 , 127 ] a \in [-127, 127]ある[ 1 2 7 1 2 7 ]
  • b ∈ [ − 127 , 127 ] b \in [-127, 127]b[ 1 2 7 1 2 7 ]

6.CIEL*u*v*色空間

CIEL * u * v * 色空間は、CIEL * a * b * 色空間と同様の均一色モデルです。CIEL * u * v * 色空間は機器に関係なく、加色原理に基づいた表示や合成に適しており、赤の表現を重視した、つまり赤の変化に敏感なモデルですが、青色の変化に敏感ですが、あまり敏感ではありません。
以下の式は、RGB 色空間から CIEL*u*v* 色空間への変換式を示します。

RGB 色空間から XYZ 色空間への変換:

画像-20211009114509255

XYZ 色空間から CIEL*u*v* 色空間への変換:

画像-20211009114622048

結果の各値の値の範囲は次のとおりです。

  • L ∈ [ 0 , 100 ] L \in [0, 100]L[ 0 ,1 0 0 ]
  • u ∈ [ − 127 , 127 ] u \in [-127, 127]あなた[ 1 2 7 1 2 7 ]
  • v ∈ [ − 127 , 127 ] v \in [-127, 127]v[ 1 2 7 1 2 7 ]

7.ベイヤー色空間

ベイヤー色空間 (ベイヤー モデル) は、CCD カメラや CMOS カメラで広く使用されています。図に示すように、単一平面の R、G、B インターリーブ テーブルからカラー画像を取得できます。

画像-20211009114825841

出力RGB画像のピクセル値は、現在点の隣接する1、2、または4個のピクセルの同じ色のピクセル値から取得されます。上記のモードは、ピクセルを左または上に移動することで変更できます。関数 cv2.cvtColor() の色空間変換パラメータでは、通常、特定のモードを示すために 2 つの特定のパラメータ x と y が使用されます。パターン構成は、グラフの 2 行目の列 2 と列 3 の値で指定されます。写真は典型的な「BG」モードです。

​ There are many common modes, such as cv2.COLOR_BayerBG2BGR, cv2.COLOR_BayerGB2BGR, cv2.COLOR_BayerRG2BGR, cv2.COLOR_BayerGR2BGR, cv2.COLOR_BayerBG2RGB, cv2.COLOR_BayerGB2RGB, cv2.COLOR_Bay erRG2RGB, cv2.COLOR_BayerGR2RGB, etc.

2. 型変換関数:

OpenCV では、色空間変換に cv2.cvtColor() 関数を使用します。この機能により、複数の色空間の変換が実現できます。

  • dst = cv2.cvtColor(src, code [, dstCn ] )

    dst: 元の入力イメージと同じデータ型と深度を持つ出力イメージを示します。

    src: 元の入力画像を示します。8 ビットの符号なしイメージ、16 ビットの符号なしイメージ、または単精度浮動小数点数などを指定できます。

    code: 色空間変換コードです。

    dstCn: は対象画像のチャンネル番号です。パラメータがデフォルトの 0 の場合、チャネル数は元の入力画像とコードから自動的に取得されます。

注: 画像深度とは、各ピクセルを保存するために使用されるビット数を指し、画像の色の解像度の尺度でもあります。8 ビットの符号なし画像などは、画像深度を指します。https://blog.csdn.net/qq_40041064/article/details/102971585

画像-20211009143102590

画像-20211009142358176

画像-20211009142432255

画像-20211009142508665

画像-20211009142554657

画像-20211009142834892

注: BGR カラー スペースは、従来の RGB カラー スペースとは異なります。標準の 24 ビット ビットマップの場合、BGR 色空間の最初のバイトには青で構成される情報が格納され、2 番目のバイトには緑で構成される情報が格納され、3 番目のバイトには赤で構成される情報が格納されます。

色空間の変換には次の規則が使用されます。

  • 8 ビット画像値の範囲は [0,255] です。
  • 16 ビット画像値の範囲は [0,65 535] です。
  • 浮動小数点画像値の範囲は[0.0~1.0]です。

線形変換の場合、これらの範囲は無関係です。ただし、非線形変換の場合、正しい変換結果を得るには、入力 RGB 画像を対応する値の範囲に正規化する必要があります。

たとえば、8 ビット画像の場合、表現できるグレー レベルは2 8 2^8です。28 = 256、つまり 8 ビット マップでは、最大 256 の状態を表すことができ、通常は [0,255] の間の値になります。ただし、多くの色空間では値の範囲が正確に [0,255] の範囲に収まらないため、このとき値を [0,255] にマッピングする必要があります。

たとえば、HSV または HLS 色空間では、色相値は通常 [0,360) の範囲にあり、8 ビット画像が上記の色空間に変換された後、色相値は 2 で除算されます。値の範囲は [0,180) になります。格納範囲を満たすために、つまり、値の分布が 8 ビット マップで表現できる範囲 [0,255] 内に収まるようにします。別の例として、CIEL * a * b * 色空間では、a チャネルと b チャネルの値の範囲は [−127,127] ですが、[0,255] の範囲に適合させるには、それぞれの値を加算する必要があります。 127. ただし、計算プロセスでの四捨五入のため、変換プロセスは正確ではなく、可逆的であることに注意してください。

3. 型変換インスタンス

1. BGR モードとグレースケール画像の間で画像を変換します。

import cv2

lena = cv2.imread('../lena512color.tiff')
gray = cv2.cvtColor(lena, cv2.COLOR_BGR2GRAY)
rgb = cv2.cvtColor(gray, cv2.COLOR_GRAY2RGB)
print(lena.shape)
print(gray.shape)
print(rgb.shape)
cv2.imshow('lena', lena)
cv2.imshow('gray', gray)
cv2.imshow('rgb', rgb)
cv2.waitKey()
cv2.destroyAllWindows()

画像-20211009145825898

注:「rgb=cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)」で得られるRGB画像では、Bチャンネル、Gチャンネル、Rチャンネルの値がすべて同じなので、やはりグレースケールのように見えます。画像。

2. 画像を BGR モードから RGB モードに変換します。

import cv2

bgr = cv2.imread('../lena512color.tiff')
rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)
cv2.imshow('bgr', bgr)
cv2.imshow('rgb', rgb)
cv2.waitKey()
cv2.destroyAllWindows()

4. HSV 色空間の説明:

RGB 色空間は広く受け入れられている色空間ですが、色空間は抽象的すぎるため、その値を通じて特定の色を直接認識することはできません。私たちは色を認識する直観的な方法を使用することに慣れており、HSV 色空間はそのような方法を提供します。HSV 色空間を使用すると、色相、彩度、明度を通じて色をより簡単に認識できます。

心理学と視覚の観点から、HSV 色空間は人間の目の色認識には主に 3 つの要素が含まれることを提案しています。

  • H: Hue (色相、色相とも呼ばれます)。
  • S: 飽和。
  • V:明るさ(値)。

**1. 色相: **

HSV色空間では、色相Hの値の範囲は[0,360]です。8 ビット画像の各ピクセルで表現できるグレー レベルは2 8 2^8です。28 = 256 であるため、HSV 画像を 8 ビット画像で表す場合、色相の角度値を [0, 255] の範囲にマッピングする必要があります。OpenCV では、8 ビット バイナリ (256 グレー レベル) の保存および表現範囲に対応するために、色相の角度値を 2 で直接除算して [0,180] の間の値を取得できます。具体的には表に示すとおりです。

画像-20211009152209129

OpenCV では、色相値を 2 で除算すると、表に示すように色相値と対応する色が得られます。マッピングされた色相値は次のとおりです。

画像-20211009152314816

値の範囲を決定したら、画像の H チャネル内の対応する値を直接検索して、特定の色を見つけることができます。たとえば、HSV イメージでは、H チャネルの値 120 のピクセルは青に対応します。H チャネルで値 120 のピクセルを見つけると、青いピクセルが見つかります。

上記に基づいて、さまざまなオブジェクトに対応する HSV 値を分析することで、さまざまなオブジェクトを見つけることができます。例えば、肌色のHSV値を解析することにより、肌色のHSV値に応じて画像内の顔(肌など)領域を直接見つけることができる。

2.彩度:

彩度値の範囲は [0,1] であるため、彩度については次の質問を説明する必要があります。

  • グレースケール色に含まれる R、G、B 成分は等しいため、極度に飽和していない色に相当します。したがって、グレースケール色の彩度の値は 0 です。
  • グレースケール画像として表示される場合、明るい領域は彩度の高い色に対応します。
  • 色の彩度が低い場合、色相を確実に計算できません。
  • また、彩度 S の値を [0,1] 範囲から [0,255] 範囲にマッピングします。

3.明るさ:

明るさの範囲は彩度の範囲と同じで、どちらも [0,1] です。同様に、輝度値も OpenCV 内の [0,255] 範囲に値をマッピングします。

明るさの値が大きいほど画像は明るくなり、明るさの値が小さいほど画像は暗くなります。明るさの値が 0 の場合、画像は真っ黒になります。

1. 指定された色を取得します。

HSV 色空間の RGB 色空間のカラー値に対応する値を取得するには、さまざまな方法があります。例えば、RGB値に対応するHSV値は、画像編集ソフトやオンラインWebサイトを通じて取得することができる。

RGB/BGR色空間からHSV色空間に変換する場合、OpenCVは8ビット画像の要件を満たすためにHSV空間の値をマッピングすることに注意してください。したがって、ソフトウェアまたは Web サイトを通じて取得した HSV 値を、OpenCV の HSV 値と一致するようにさらにマッピングする必要があります。

例: OpenCV では、RGB 色空間のさまざまな色の値を、HSV 色空間の対応する値に変換した後にテストします。

import cv2
import numpy as np

img_blue = np.zeros([1, 1, 3], dtype=np.uint8)
img_blue[0, 0, 0] = 255
blue = img_blue
blue_hsv = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)
print('blue=\n', blue)
print('blue_hsv=\n', blue_hsv)

img_green = np.zeros([1, 1, 3], dtype=np.uint8)
img_green[0, 0, 1] = 255
green = img_green
green_hsv = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
print('green=\n', green)
print('green_hsv=\n', green_hsv)

img_red = np.zeros([1, 1, 3], dtype=np.uint8)
img_red[0, 0, 2] = 255
red = img_red
red_hsv = cv2.cvtColor(red, cv2.COLOR_BGR2HSV)
print('red=\n', red)
print('red_hsv=\n', red_hsv)

# 输出结果
blue=
 [[[255   0   0]]]
blue_hsv=
 [[[120 255 255]]]
green=
 [[[  0 255   0]]]
green_hsv=
 [[[ 60 255 255]]]
red=
 [[[  0   0 255]]]
red_hsv=
 [[[  0 255 255]]]

2. 指定した色をマークします。

HSV 色空間では、H チャネル (彩度色相チャネル) がさまざまな色に対応します。あるいは別の見方をすると、色の違いは主にHチャンネルの値の違いに反映されます。したがって、H チャネル値をフィルタリングすることにより、特定の色をフィルタリングすることができます。たとえば、HSV 画像で、H チャネルの値が 240 (OpenCV では 120 に調整) のピクセルのみがコントロールによって表示される場合、画像には青い部分のみが表示されます。

  • inRange() 関数を通じて特定の値をロックする

    OpenCV では、関数 cv2.inRange() を使用して、画像内のピクセルのピクセル値が指定された範囲内にあるかどうかを判断します。構文は次のとおりです。

    • dst=cv2.inRange(ソース、下位b、上位b)

      dst: 出力結果を示します。サイズは src と一致します。

      src: チェックする配列またはイメージを示します。

      lowerb: 範囲の下限を示します。

      upperb: 範囲の上限を示します。

    • 戻り値 dst は src と同じサイズで、その値は src の対応する位置の値が区間 [ lowerb, upperb ] 内にあるかどうかによって異なります。

      • src 値が指定された間隔内にある場合、dst の対応する位置の値は 255 になります。
      • src 値が指定された範囲内にない場合、dst の対応する位置の値は 0 になります。

    例: 関数 cv2.inRange() を使用して、画像内の [100,200] 内の値をマークアウトします。

    import cv2
    import numpy as np
    
    img = np.random.randint(0, 256, size=[5, 5], dtype=np.uint8)
    min = 100
    max = 200
    mask = cv2.inRange(img, min, max)
    print('img=\n', img)
    print('mask=\n', mask)
    
    # 输出结果
    img=
     [[170 181 245  13 255]
     [ 79  72 133 113 138]
     [112  72 169  87  47]
     [142 210 139  94 165]
     [ 32  16   9  89  95]]
    mask=
     [[255 255   0   0   0]
     [  0   0 255 255 255]
     [255   0 255   0   0]
     [255   0 255   0 255]
     [  0   0   0   0   0]]
    
  • マスクベースのビットごとの AND 演算を介して ROI を表示します。

    例: 画像内の関心領域 (ROI) を通常どおり表示し、残りを黒で表示します。

    import cv2
    import numpy as np
    
    img = np.ones([5, 5], dtype=np.uint8) * 9
    mask = np.zeros([5, 5], dtype=np.uint8)
    mask[0:3, 0] = 1
    mask[2:5, 2:4] = 1
    
    roi = cv2.bitwise_and(img, img, mask=mask)
    print('img=\n', img)
    print('mask=\n', mask)
    print('roi=\n', roi)
    
    # 输出结果
    img=
     [[9 9 9 9 9]
     [9 9 9 9 9]
     [9 9 9 9 9]
     [9 9 9 9 9]
     [9 9 9 9 9]]
    mask=
     [[1 0 0 0 0]
     [1 0 0 0 0]
     [1 0 1 1 0]
     [0 0 1 1 0]
     [0 0 1 1 0]]
    roi=
     [[9 0 0 0 0]
     [9 0 0 0 0]
     [9 0 9 9 0]
     [0 0 9 9 0]
     [0 0 9 9 0]]
    
  • 特定の色の値を表示します。

    例: OpenCV を使用して、画像内のさまざまな色を抽出します。

    なお、実際に色を抽出する場合は、特定の値を抽出するのではなく、色の間隔を抽出することが多いです。たとえば、OpenCV の HSV モードでは、H チャネルの青の値は 120 です。青色を抽出する場合、通常は「青色値120」付近の区間の値を抽出範囲とします。この間隔の半径は通常 10 程度で、たとえば [120−10,120+10] の範囲の値が通常青を指定するために抽出されます。

    対照的に、HSV モードの S チャネルと V チャネルの値の範囲は一般的に [100,255] です。これは主に、彩度と明度が低すぎる場合、計算された色相が信頼できない可能性があるためです。

    import cv2
    import numpy as np
    
    
    img = cv2.imread('../pepper.tiff')
    cv2.imshow('img', img)
    print(img)
    img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    cv2.imshow('img_hsv', img_hsv)
    
    min_red = np.array([0, 50, 50])
    max_red = np.array([20, 255, 255])
    mask = cv2.inRange(img_hsv, min_red, max_red)
    img_red = cv2.bitwise_and(img_hsv, img_hsv, mask=mask)
    cv2.imshow('img_red', img_red)
    
    min_green = np.array([40, 50, 50])
    max_green = np.array([70, 255, 255])
    mask = cv2.inRange(img_hsv, min_green, max_green)
    img_green = cv2.bitwise_and(img_hsv, img_hsv, mask=mask)
    cv2.imshow('img_green', img_green)
    
    min_yellow = np.array([20, 50, 50])
    max_yellow = np.array([40, 255, 255])
    mask = cv2.inRange(img_hsv, min_yellow, max_yellow)
    img_yellow = cv2.bitwise_and(img_hsv, img_hsv, mask=mask)
    cv2.imshow('img_yellow', img_yellow)
    
    cv2.waitKey()
    cv2.destroyAllWindows()
    

5.αチャンネル:

RGB 色空間の 3 つのチャネルに基づいて、アルファ チャネルとも呼ばれる A チャネルを追加して、透明度を示すことができます。この 4 チャネルの色空間は RGBA 色空間と呼ばれ、PNG 画像は典型的な 4 チャネルの画像です。アルファ チャネルの割り当て範囲は [0,1] または [0,255] で、これは透明から不透明までを意味します。

例: 画像のアルファ チャネルを処理するプログラムを作成します。

import cv2

img = cv2.imread('../lena512color.tiff')
bgra = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
b, g, r, a = cv2.split(bgra)
a[:, :] = 125
bgra_125 = cv2.merge([b, g, r, a])
a[:, :] = 0
bgra_0 = cv2.merge([b, g, r, a])

cv2.imshow('img', img)
cv2.imshow('bgra', bgra)
cv2.imshow('bgra_125', bgra_125)
cv2.imshow('bgra_0', bgra_0)

cv2.imwrite('../bgra_125.png', bgra_125)
cv2.imwrite('../bgra_0.png', bgra_0)

cv2.waitKey()
cv2.destroyAllWindows()

画像-20211010135327358

bgra_125 と bgra_0 の画像は上に示されています注: cv2.imshow のみを使用して画像を表示する場合、各画像のアルファ チャネル値は異なりますが、表示時には違いはありません。cv2.imwrite() を使用してローカル ファイルに保存すると、それが異なることがわかります。

おすすめ

転載: blog.csdn.net/weixin_57440207/article/details/122646984