opencvの学習4:色空間変換

1.共通の色空間

ここに画像の説明を挿入RGB色空間
RGB(赤、緑、青)色空間は、ディスプレイシステムで最も一般的に使用されています。カラーカソードレイチューブとカラーラスターグラフィックスディスプレイは、R、G、およびBの値を使用してR、G、およびBの電子銃を駆動しますスキャナーは、蛍光体スクリーン上のR、G、Bの3色の蛍光体をそれぞれ励起して異なる輝度の光を放射し、追加と混合によってさまざまな色を生成します。スキャナーは、元の反射または透過からの光も吸収します。 R、G、Bコンポーネント、およびそれを使用してオリジナルの色を表します。RGB色空間は、デバイス関連の色空間と呼ばれます。これは、スキャナーが異なれば同じ画像をスキャンし、異なる色の画像データを取得するためです。モニターのモデルが異なれば同じ画像を表示しますが、色の表示結果も異なります。モニターとスキャナーで使用されるRGB空間は、デバイスに依存しない色空間であるCIE 1931RGB実数3原色システム空間とは異なります。ところで:Photoshopのカラーピッカー。HSB、RGB、LAB、およびCMYK色空間の各色の色値を表示できます。
HSV色空間
HSV(色相、彩度、値)色空間モデルは、円筒座標系の円錐形のサブセットに対応し、円錐の上面はV = 1に対応します。RGBにR = 1、G = 1が含まれます。モデル、B = 1 3つの面、表される色はより明るいです。色Hは、V軸周りの回転角によって与えられます。赤は0°の角度に対応し、緑は120°の角度に対応し、青は240°の角度に対応します。HSVカラーモデルでは、各色は補色と180°異なります。彩度Sは0から1の値を取るため、円錐の上面の半径は1です。HSVカラーモデルで表される色域は、CIE色度図のサブセットです。このモデルでは、彩度が100%の色の純度は100%未満です。円錐の頂点(または原点)では、V = 0、HとSは未定義であり、黒を表します。円錐の上面の中心では、S = 0、V = 1、Hは定義されておらず、白を表しています。この点から原点までは、明るさが暗くなるグレー、つまりグレーレベルが異なるグレーを表します。これらの点では、S = 0であり、Hの値は定義されていません。HSVモデルのV軸は、RGB色空間の主対角線に対応していると言えます。円錐の上面の円周上の色、V = 1、S = 1、この色は純粋な色です。HSVモデルは、画家のカラーマッチング方法に対応しています。画家は、色密度と色深度を変更して特定の純粋な色からさまざまな色調を取得し、純粋な色に白を追加して色密度を変更し、黒を追加して色深度を変更し、さまざまな比率を追加する方法を使用します。黒を得るために白。さまざまな色合い。
HSI色空間
HSIの色空間は、人間の視覚システムから始まり、色相(色相)、彩度(彩度または彩度)、および明るさ(強度または明るさ)を使用して色を記述します。HSI色空間は、円錐空間モデルで記述できます。この円錐モデルを使用してHIS色空間を記述することは非常に複雑ですが、色相、明るさ、彩度の変化を非常に明確に表現できます。色相と彩度は通常、彩度と呼ばれ、色の種類と深さを示すために使用されます。人間の視覚は色の密度よりも明るさに敏感であるため、色の処理と認識を容易にするために、人間の視覚システムは多くの場合、RGB色空間よりも人間の視覚特性に一致するHSI色空間を使用します。画像処理とコンピュータビジョンの多数のアルゴリズムは、HSI色空間で便利に使用でき、別々に処理でき、互いに独立しています。したがって、HSI色空間は、画像分析と処理の作業負荷を大幅に簡素化できます。HSI色空間とRGB色空間は、同じ物理量の異なる表現であるため、それらの間には変換関係があります。

HSIカラーモデルは、人間の視覚系から始まり、色を表すために色相をH、彩度をS、強度をIで使用します。彩度は、色の白色光の量に反比例するだけで、色が鮮やかかどうかの指標と言えます。したがって、モニターでHISモデルを使用して画像を処理すると、より現実的な結果を得ることができます。
色相:オブジェクトの透過または反射の波長を指します。赤、オレンジ、緑など、0〜360度の範囲の色で識別するのが一般的です。
彩度:彩度とも呼ばれ、色の強度または純度を指します。彩度は、グレーと色相の比率を表し、0%(グレー)から100%(完全に飽和)まで測定されます。
強度:色の相対的な明るさを指し、通常は0%(黒)から100%(白)までのパーセンテージとして測定されます。
YCrCb色空間
YCrCb(YUV)は主に、カラービデオ信号の送信を最適化して、昔ながらの白黒テレビとの下位互換性を持たせるために使用されます。RGBビデオ信号送信と比較して、その最大の利点は、帯域幅をほとんど使用しないことです(RGBでは、3つの独立したビデオ信号を同時に送信する必要があります)。その中で、「Y」はグレースケール値である明るさ(輝度またはルマ)を表し、「U」と「V」は画像の色と彩度を表すために使用される彩度(クロミナンスまたは彩度)を表します。 。ピクセルの色を指定します。「明るさ」は、RGB信号の特定の部分を足し合わせることにより、RGB入力信号によって確立されます。「クロマ」は、色相と彩度の2つの側面を定義し、それぞれCrとCBで表されます。その中で、CrはRGB入力信号の赤色部分とRGB信号の輝度値の差を反映しています。また、CBは、RGB入力信号の青色部分とRGB信号の輝度値の差を反映します。YUV色空間を使用することの重要性は、その輝度信号Yとクロミナンス信号UおよびVが分離されていることです。Y信号成分のみがあり、U成分とV成分がない場合、このように表される画像は白黒のグレースケール画像です。カラーテレビはYUV空間を採用し、カラーテレビと白黒テレビの明るさ信号Yとの互換性の問題を解決し、白黒テレビもカラーテレビ信号を受信できるようにしています。YUVとRGBの間の変換式は次のとおりです(RGB値の範囲は0〜255):Y = 0.299R + 0.587G + 0.114BU = -0.147R-0.289G + 0.436BV = 0.615R-0.515G- 0.100BR = Y + 1.14VG = Y-0.39U-0.58VB = Y +2。03U DirectShowでは、一般的なRGB形式はRGB1、RGB4、RGB8、RGB565、RGB555、RGB24、RGB32、ARGB32などです。一般的なYUV形式はYUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUVです。 、YV12、YVU9、YUV411、YUV420など。YCrCb空間は、一般的な画像がRGB空間に基づいているため、顔検出でもよく使用されます。RGB空間では、顔の肌の色が明るさの影響を大きく受けるため、肌の色の点と肌以外の色の点を区別することが困難です。つまり、この空間で処理した後、肌の色のポイントは、中央に多くの非肌の色が埋め込まれた離散ポイントであるため、肌の色の領域のキャリブレーション(顔のキャリブレーション、目など)が困難になります。 。RGBをYCrCb空間に変換する場合、この空間は明るさの影響をほとんど受けず、肌の色調が良好な収束をもたらすため、Y(明るさ)の影響を無視できます。このように、3次元空間は2次元CrCbになり、肌の色の点は特定の形状を形成します。たとえば、人間の顔がある場合は、人間の顔の領域が表示され、腕を持っていると腕の形が見えます良いです経験上、ある点のCrCb値は133≤Cr≤173、77≤Cb≤127を満たすので、この点は次のようになります。肌の色のポイント、その他は肌以外の色のポイントです。
YCrCb色空間は肌の色検出に良い効果があります。HSV色空間よりも優れています。
いくつかのオンラインデータを調べると、通常の黄色のレースのCr成分は約140〜175であり、Cb成分は約100〜120。
リファレンスブログ:YCrCb色空間と肌の色調の検出

YCbCrとYUVの違い
yuvカラーモデルは、画像処理に適した明るさと彩度を分離することを特徴とするrgbモデルから派生しています。

YCbCrモデルはyuvモデルから派生し、デジタルビデオに適用されます。ITU-RBT.601推奨

上記の比較により、h.264やmpegなどのエンコーディング標準で使用しているyuvが実際にはYcbCrであることが確認できます。名前と混同しないでください。
人の視野角特性を利用してデータ量を減らすために、通常、RGB空間で表されるカラー画像は他の色空間に変換されます。現在使用されている色空間変換には、YIQ、YUV、YCrCbの3つがあります。各色空間は、輝度成分信号と2つのクロミナンス成分信号を生成し、各変換で使用されるパラメーターは、特定のタイプのディスプレイデバイスに適合されます。その中で、YIQはNTSCカラーTVシステムに適しており、YUVはPALおよびSECAMカラーTVシステムに適しており、YCrCbはコンピューターモニターに適しています。

YUVはこれらの英語の単語の組み合わせではなく、記号です。Yは明るさを表し、UVは色の違いを表すために使用され、UとVは色の2つの要素です。

YUVの利点:
1。YUV表記の重要性は、その輝度信号(Y)とクロミナンス信号(U、V)が互いに独立していることです。
2. YUV表記のもう1つの利点は、人間の目の特性を利用して、デジタルカラー画像に必要なストレージ容量を削減できることです。

YCbCrここで、Yは輝度成分、Cbは青のクロミナンス成分、Crは赤のクロミナンス成分を表します。
YCbCrは、World DigitalOrganizationのビデオ標準の開発中のITU-RBT1601勧告の一部であり、実際にはYUVのスケーリングおよびオフセットレプリカです。その中で、YはYUVのYと同じ意味です。CbとCrも色を指しますが、表現方法が異なります。YUVファミリーでは、YCbCrはコンピューターシステムで最も広く使用されているメンバーであり、幅広いアプリケーションがあります。JPEGとMPEGの両方がこの形式を使用します。一般的に言えば、YUVは主にYCbCrを指します。YCbCrには、4:4:4、4:2:2、4:1:1、4:2:0などの多くのサンプリング形式があります。

次に、変換関数を呼び出して、画像の色空間変換を実現します

コードは次のように表示されます。

import cv2 as cv  #导入cv模块

#色彩空间的转换
def color_space_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)#RGB转换为gray
    cv.imshow("gray", gray)
    hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)#RGB转换为hsv
    cv.imshow("hsv", hsv)
    yuv = cv.cvtColor(image, cv.COLOR_BGR2YUV)#RGB转换为yuv
    cv.imshow("yuv", yuv)
    ycrcb = cv.cvtColor(image, cv.COLOR_BGR2YCrCb)#RGB转换为ycrcb
    cv.imshow("ycrcb", ycrcb)

src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/lena.jpg")  #读取图片位置
#blue green red
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)  #创建一个GUI
cv.imshow("input image", src) #对窗口图片进行展示
color_space_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()  #释放所有的内存

スクリーンショットの実行:
ここに画像の説明を挿入HSV色空間の説明:
H:0-180 S:0-255 V:0-255
次の表
で、対応する色のRGBコンポーネント範囲に対応する他の色のHSV色をフィルタリングできます。
ここに画像の説明を挿入

3.色空間変換、inRange関数を使用してビデオの色をフィルタリングし、特定の色の追跡を実現します

コードは次のように表示されます。

import cv2 as cv  #导入cv模块
import numpy as np #np科学计数的包,通过numpy对数据进行处理

def extrace_object_demo():
    capture = cv.VideoCapture("C:/Users/lenovo/Desktop/opencv/daima/banknum/test.mp4") #导入视频
    while(True):
        ret, frame = capture.read()
        if ret == False:
            break;
        hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV) #转换色彩空间为hsv
        #设置绿色的范围,跟踪视频中的绿色
        lower_hsv = np.array([37, 43, 46])#设置过滤的颜色的低值
        upper_hsv = np.array([77, 255, 255])#设置过滤的颜色的高值
        mask = cv.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv)#调节图像颜色信息(H)、饱和度(S)、亮度(V)区间,选择绿色区域
        cv.imshow("video", frame)
        cv.imshow("mask", mask)
        c = cv.waitKey(40)
        if c == 27:
            break

extrace_object_demo()
cv.waitKey(0)
cv.destroyAllWindows()

スクリーンショットの実行:
ここに画像の説明を挿入inRange関数は非常に単純です。3つの
パラメーターがあります。最初の
パラメーター:hsvは元の画像を参照します。2番目のパラメーター:lower_redは、画像内のこのlower_redよりも低い値を参照します。画像の値は0になります。黒色である
。最初の3つのパラメータ:これは画像内upper_redよりも高い値を指すupper_red、画像の値が0になる
とlower_red〜upper_red間の値が白である、255になります

4、チャネル分離、合併、チャネルの変更

関与する関数:
split()はカラー画像を3つのチャネルに分割します
merge()チャネルマージ
コードは次のとおりです。

import cv2 as cv
import numpy as np
 
 
src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/lena.jpg")  #读取图片位置
#blue green red
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)  #创建一个GUI
cv.imshow("input image", src) #对窗口图片进行展示
 
#通道分离,输出三个单通道图片
b, g, r = cv.split(src)#将彩色图像分割成3个通道
cv.imshow("blue", b)
cv.imshow("green", g)
cv.imshow("red", r)
 
#通道合并
src = cv.merge([b, g, r]) #将三个通道进行合并
cv.imshow("changed image", src)
 
#修改某个通道的值
src[:, :, 2] = 0 #将红色通道改为0
cv.imshow("single", src)
 
cv.waitKey(0)
cv.destroyAllWindows()

スクリーンショットを実行します。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_44145452/article/details/112424288