OpenCV-Python開発ガイド(8)---色空間変換とHSVの簡単なアプリケーション

序文

以前の理論的知識の紹介の後、さまざまな色空間タイプを習得しました。このブログ投稿では、主にコードを使用してOpenCVで色空間型変換を実現する方法を紹介しています。

RGBとグレーの間で変換する

OpenCVでは、cv2.cvtColor()関数を使用して色空間変換を実現します。この関数の色空間タイプは列挙型で表され、COLOR_BGR2GRAY列挙型はRGBをGRAYに変換するために特別に提供されています。

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

import cv2

img = cv2.imread("4.jpg", -1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("rgb", img)
cv2.imshow("gray", gray)
cv2.waitKey()
cv2.destroyAllWindows()

実行後の効果は
BGRからGRAY
の図のようになります。次に、GRAYがRGBに変換される方法を見てみましょう。具体的なコードは次のとおりです。

import cv2

img = cv2.imread("4.jpg", 0)
bgr = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cv2.imshow("gray", img)
cv2.imshow("rgb", bgr)
cv2.waitKey()
cv2.destroyAllWindows()

実行後の表示効果は下図のように
灰色からBGRへ
なります。RGB画像のカラー3DマトリックスはBGRであるため、変換する際にはBGR2GRAYとGRAY2BGRを使用します。ここから、列挙型定数は実際には非常に理解しやすいことがわかります。変換型の名前を逆にするだけです。

ただし、グレースケール画像にはカラー値がなく、想像力で計算を復元できないため、グレースケール画像からRGB画像への変換は変わらないことがわかりましたが、グレースケール画像からRGB画像への変換には一定の意味があります。色を付ける必要がある場合、グレースケール画像は2次元マトリックスであり、色値の3次元マトリックスではないため、値を割り当てることはできません。グレーでRGBに変換した後、特定のピクセルがグレーであっても、RGB画像を操作するようにカラー値を変更できます。

RGBとHSVの間で変換する

上記のコードと同様に、cv2.cvtColor()を使用して色空間を変換します。

import cv2

img = cv2.imread("4.jpg", -1)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow("bgr", img)
cv2.imshow("hsv", hsv)
cv2.waitKey()
cv2.destroyAllWindows()

実行後、次の画像が表示されます。
BGRからHSV
以前の理論的知識では、色相の値に応じて特定の色を取得できます。つまり、HSVのHチャネルの値から特定の色を抽出できます。この色の抽出と分析の利点は、顔認識で肌の色を識別するために使用できます。

次に、青で試してみましょう。具体的なコードは次のとおりです。

import cv2

img = cv2.imread("4.jpg", -1)
img[:, :, 0] = 255
Blue = img
blueHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow("imgBlue", Blue)
cv2.imshow("blueHSV", blueHSV)
cv2.waitKey()
cv2.destroyAllWindows()

実行後の効果は次のとおりです。
青い
次に、赤い領域を抽出してみましょう。完全なコードは次のとおりです。

import cv2
import numpy as np

img = cv2.imread("4.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow("hsv", hsv)
minBlue = np.array([0, 50, 50])
maxBlue = np.array([30, 255, 255])
# 确定蓝色区域
mask = cv2.inRange(hsv, minBlue, maxBlue)
# 通过按位与获取蓝色区域
blue_img = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow("blue", blue_img)
cv2.waitKey()
cv2.destroyAllWindows()

ここでは、新しいメソッドcv2.inRange()を使用します。その定義は次のとおりです。

def inRange(src, lowerb, upperb, dst=None):

src:チェックする配列またはアバターを示します

lowerb:範囲の下限を表します

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

この方法により、画像内のピクセルのピクセル値が特定の間隔内にあるかどうかを判断できます。

前の理論的な説明の後、HSVのHは0に等しく、赤であることがわかります。互換性のために、赤の値を上下に拡張する必要がありますが、色の範囲自体を0未満にすることはできないため、上限を拡張すること、つまり30の範囲を拡張することしかできません。

HSVのSチャネルの場合、Vチャネルの値の範囲は[100,255]です。したがって、画像の赤の値を取得するために、制限を[0、50、50]から[30、255、255]に制限します。実行後、画像の赤の色が抽出さ
赤を抽出
れます。この例から、cv2.inRange()を使用して画像内の指定された範囲の値をマークし、マスクに戻ることができます。画像の値がこの間隔内にある場合、マスクの対応する位置の値は255です。それ以外の場合は、0です。次に、マスキングのビットごとのAND演算により、指定された色が取り出されます。

ここで、bitwise_andには3番目のパラメーターマスクがあります。これは、マスクを使用して「AND」操作を実行します。つまり、マスク画像の白い領域は、処理する必要のある画像ピクセルの予約であり、黒い領域は処理する必要があります。 areaは、処理する必要のある画像ピクセルの削除です。

おすすめ

転載: blog.csdn.net/liyuanjinglyj/article/details/113795768