OpenCV Python (3) [画像前処理:色空間変換] && 色認識

1. 色空間と色域の違い

この 2 つの名詞については、私が学習を始めた当初は混同されることが多かったのですが、現在の色空間と色域についての個人的な理解は以下のとおりです。
色空間は色を表すための数値の使用を指し、色域は色空間の範囲を表します。したがって、色域変換は実際には色空間のサブセットへの変更、つまりピクセル値の範囲の増加または減少を表しますが、色空間変換はこのカラーモデルの置き換えを表し、範囲を変更するだけでなく、それぞれの数値または配列で表される色を変更し、次元も変更します。つまり、画像の深さを変更します。

2. 色空間

以下に説明する色空間は、現在私が個人的に使用する必要がある色空間です。

1. グレー色空間

グレー色空間は、通常グレースケール イメージと呼ばれるもので、通常は 8 ビット グレースケール イメージ、つまり 0 ~ 255 の範囲です。ピクセル値が低いほど、グレースケール値は暗くなり、黒に近づき、その逆になります。逆も同様で、境界値に達すると、つまりピクセル値が 0 の場合、ピクセル ポイントは真っ黒になり、ピクセル値が 255 の場合、ピクセル ポイントは真っ白になります
この色空間を使用すると、計算量を大幅に削減でき、その後の画像処理にも便利です。たとえば、RGB 画像の 2 値化など、1 次元画像が必要な画像処理の場合、最初に RGB 画像を 2 値に変換することができます。 GRAY画像を選択し、二値化処理を実行します

2. RGB色空間

一般に、カメラやその他のハードウェア デバイスを通じて取得する画像は RGB 画像です。
RGB 画像は、赤 (R)、緑 (G)、青 (B) の3 つのカラー チャネルで構成されます。各チャネルのバイト サイズは 0 ~ 255、つまり 1 つのパスは 256 ピクセルです。 RGB 色空間は人間の視覚で認識できるほぼすべての色を含むため、表現できる色の種類は 256×256×256、つまり 16,777,216 色に達します。現在最も広く使用されている色空間。
上記のことから、RGB 色空間の各ピクセルには 3 つのピクセル値があることがわかります。つまり、1 つのピクセルは 3 つのピクセル値で構成される配列で表されます。R、G、B、つまり赤、緑、青の 3 つのチャネルに対応して、ピクセル点の RGB 値が (255, 0, 0) の場合は赤、RGB 値が ( 0, 255, 0 )、ポイントは緑色、RGB 値が (0, 0, 255) の場合、ポイントは青色になります。(0, 0, 0)は黒を意味し、(255, 255, 255) は白を意味しますRGB色空間が各チャンネルの画素値で重ね合わされており、3層の重ね合わせによりグレーレベルから異なる色が得られていることがわかります。
また、(255,255,0)はイエローを表し、(0,255,255)はシアンを表す。

3. HSV色空間

上で述べたように、RGB 色空間の色の種類と範囲は非常に複雑で、十分に明確ではありません。HSV色空間は、カラーブロックを一定の範囲内で分割することができます。
HSV 色空間は、色相 H、彩度 S、明度 V で構成されます。H の範囲は 0 ~ 180、S の範囲は 0 ~ 255、V の範囲は 0 ~ 255 です。特定の色間隔が表示されます。以下の表にあります
ここに画像の説明を挿入

3. 色空間変換: cvtColor

1.RGB、GRAY、HSV画像を取得する

最初の記事「OpenCV Python (1): インストールと画像の取得、表示、保存」では、カメラなどのハードウェアを介して、またはビデオや写真から直接 RGB 画像を取得する方法があり、これらの方法は上記の記事で詳しく説明されていますここでは詳細には触れず、主に GRAY および HSV 色空間で画像を取得する方法を示します。
実はGRAY画像の取得については前回の記事でも触れましたが、imreadメソッドではグレースケール画像を取得する方法として以下の2つがあるように、imreadメソッドではグレースケール画像の取得を選択することができます。imread関数については前回の記事でも確認できます。

cv2.imread('xx.jpg', 0)	# 0为灰度图
cv2.imread('xx.jpg', cv2.IMREAD_GRAYSCALE)	# 灰度图

カメラやビデオを使用して画像を取得する必要がある場合、imread を使用する前に画像を保存してから取得する必要があり、非常に面倒で非効率的です。このとき、グレースケール画像や HSV 画像を取得したい場合は、 cvtColor は opencv-python 関数によって提供されます。

获取灰度图:img_g = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
获取HSV图:img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
'''
img 为获取到的RGB图像,此处则将RGB转换为GRAY和HSV
cv2.COLOR_BGR2GRAY为 BGR to GRAY
cv2.COLOR_BGR2HSV为 BGR to HSV
BGR也是RGB颜色空间,只是顺序调换了,前面输入的img为RGB颜色空间即可。
'''

2. RGB、GRAY、HSV 画像ケースを取得する

(1)、カメラは画像を取得して変換します。

プログラムは次のようになります。

import cv2  # 导入opencv库

if __name__ == '__main__':
    video = cv2.VideoCapture(0)  # 选择摄像头0、1... 或 选择视频路径
    while True:
        ret, img_RGB = video.read()
        # 获取摄像头或视频的一帧,ret判断获取是否成功,成功则为True;img为获取的图像
        if ret:
            img_GRAY = cv2.cvtColor(img_RGB, cv2.COLOR_BGR2GRAY)  # 获取GRAY图像
            img_HSV = cv2.cvtColor(img_RGB, cv2.COLOR_BGR2HSV)  # 获取HSV图像

            cv2.imshow("RGB", img_RGB)  # 显示RGB图像
            cv2.imshow("GRAY", img_GRAY)  # 显示GRAY图像
            cv2.imshow('HSV', img_HSV)  # 显示HSV图像

            cv2.waitKey(1)  # 等待时间
        else:
            # print("摄像头未打开。")
            pass  # 图像获取失败,可能未接入摄像头

(2)、インポート画像直接変換&再変換

プログラムは次のようになります。

import cv2  # 导入opencv库

if __name__ == '__main__':
    while True:
        img_RGB = cv2.imread('img/2.jpg', 1)    # 获取路径img/2.jpg的图像,图像类型为RGB图像
        img_GRAY = cv2.imread('img/2.jpg', 0)  # 获取路径img/2.jpg的图像,图像类型为GRAY图像
        img_HSV = cv2.cvtColor(img_RGB, cv2.COLOR_BGR2HSV)     # 获取HSV图像

        cv2.imshow("RGB", img_RGB)  # 显示RGB图像
        cv2.imshow("GRAY", img_GRAY)  # 显示GRAY图像
        cv2.imshow('HSV', img_HSV)  # 显示HSV图像

        cv2.waitKey(1)  # 等待时间

効果は次のとおりです。赤い封筒の画像を取得した後、赤い封筒を金の封筒に変換します。つまり、RGB 画像を HSV 画像に変換します。
ここに画像の説明を挿入

3. GRAY および HSV 画像を RGB 画像に変換します。

上の図に示すように、灰色のパケットと金色のパケット、つまり赤色のパケットの灰色画像と HSV 画像が表示されます。上記のプログラムを基に、それぞれRGB画像に変換するプログラムは次のとおりです。

import cv2  # 导入opencv库

if __name__ == '__main__':
    while True:
        img_RGB = cv2.imread('img/2.jpg', 1)    # 获取路径img/0.jpg的图像,图像类型为RGB图像
        img_GRAT = cv2.imread('img/2.jpg', 0)  # 获取路径img/0.jpg的图像,图像类型为GRAY图像
        img_HSV = cv2.cvtColor(img_RGB, cv2.COLOR_BGR2HSV)     # 获取HSV图像

        img_GRAT2RGB = cv2.cvtColor(img_GRAT, cv2.COLOR_GRAY2BGR)   # 将灰度图转换为RGB图
        img_HSV2RGB = cv2.cvtColor(img_HSV, cv2.COLOR_HSV2BGR)   # 将HSV图转换为RGB图

        cv2.imshow("RGB", img_RGB)  # 显示RGB图像
        cv2.imshow("GRAY2RGB", img_GRAT2RGB)  # 显示GRAY图像
        cv2.imshow('HSV2RGB', img_HSV2RGB)  # 显示HSV图像

        cv2.waitKey(1)  # 等待时间

効果は以下の通りで、HSV画像を再度RGB画像に変換すると元の画像情報は変更されず元の画像が復元されるのに対し、GRAY画像は元の画像に変換されることが分かります。RGB 画像を再度実行すると、画像は多くの色情報を失います。これは、GRAY カラー スペースのチャネル数が 1 であるのに対し、RGB カラー スペースと HSV カラー スペースのチャネル数は両方とも 3 であるためです。 3 チャンネルの数を 1 チャンネルの数に変換すると、必然的に多くの色情報が失われますが、同時に、その後の画像処理操作の実行時間も大幅に短縮されます
ここに画像の説明を挿入

4. 色認識: HSV+inRange

以下に、上記の色空間変換を組み合わせて色認識と二値化を行う方法について説明します。

1.inRange関数

inRange はopencv-python が提供するHSV 色空間に基づく二値化関数で、具体的な使用方法は以下の通りです。

img_bin = cv2.inRange(img_hsv, lower, upper)	#低于lower、高于upper为0,中间为255

2.ケース

プログラムは次のようになります。

import cv2  # 导入opencv库

if __name__ == '__main__':
    while True:
        img_RGB = cv2.imread('img/3.jpg', 1)    # 获取路径img/0.jpg的图像,图像类型为RGB图像
        img_HSV = cv2.cvtColor(img_RGB, cv2.COLOR_BGR2HSV)     # 获取HSV图像

        img_bin1 = cv2.inRange(img_HSV, (0, 43, 46), (10, 255, 255))  # 低于lower、高于upper为0,中间为255
        img_bin2 = cv2.inRange(img_HSV, (156, 43, 46), (180, 255, 255))  # 低于lower、高于upper为0,中间为255
        img_bin = cv2.add(img_bin1, img_bin2)      # 将两张图像相加,即汇总所有白色像素

        cv2.imshow("RGB", img_RGB)  # 显示RGB图像
        cv2.imshow('HSV', img_HSV)  # 显示HSV图像
        cv2.imshow('BIN1', img_bin1)    # 显示红色范围一的二值化图像
        cv2.imshow('BIN2', img_bin2)    # 显示红色范围二的二值化图像
        cv2.imshow('BIN', img_bin)  # 显示红色总范围的二值化图像

        cv2.waitKey(1)  # 等待时间

効果としては、
ここに画像の説明を挿入
画像内の赤い部分を白画素に二値化し、残りの色を黒画素に二値化するという機能が実現されており、再度位置合わせすると一次元画像となり、赤部分が取り出せるようになります。画像を横断することで見つけられます。
ここで 2 つの画像を追加するのは、2 つの範囲の白を合計する、つまり2 つの範囲の赤を確実に認識できるようにするためです。理由は下図に示すとおりです。赤には 2 つの色があります。 HSV 色空間の範囲。
2値化画像の追加ルールは非常に簡単で、画像サイズを揃える場合、0+255=255; 255+0=255; 0+0=0; 255+255=255 となります
1~3の加算式は分かりやすいですが、4番目の加算式は実はopencvの画像加算に伴う飽和演算によるもので、255を超えると255になるというものです。
ここに画像の説明を挿入
私は学生で現在勉強中です、この記事は私の勉強メモとも言えるものです、間違っていたらご指摘ください。

おすすめ

転載: blog.csdn.net/xztli/article/details/126155365
おすすめ