Python で OpenCV を使用した画像の色の検出

Manav Narula 2023年1月30日
  1. Python の OpenCV ライブラリを使用した画像の色の検出
  2. まとめ
Python で OpenCV を使用した画像の色の検出

OpenCV ライブラリは、Computer Vision タスクを支援するために作成されており、さまざまなプログラミング言語と互換性があります。ライブラリには、画像を処理するためのさまざまな便利なアルゴリズムと手法が実装されています。

このチュートリアルでは、Python の OpenCV ライブラリを使用して画像の色検出を実行する方法を示します。

色検出にはさまざまな用途があります。これを使用して、実生活でオブジェクトを区別できます。同様の特性に基づいてすべてのピクセルにラベルを付けようとするため、これは画像セグメンテーション手法と見なすこともできます。

HueSaturationValue の略である HSV カラースペースを使用して色を検出します。これは円筒形のカラースペースで、カラー情報を操作するときに非常に便利です。

色相は色情報を決定し、彩度は色の強さを表し、値は色が黒と混合される量に基づいて明るさを決定します。

Python の OpenCV ライブラリを使用した画像の色の検出

OpenCV ライブラリのさまざまな関数を使用して色を検出します。以下でそれらについて議論しましょう。

特定の画像で 1つの特定の色を検出し、検出されたセグメントの周囲に境界を追加します。

必要な画像を BGR カラースペースから HSV に変換する必要があります。画像でこのような変換を実行するには、OpenCV ライブラリの cvtColor() 関数を使用できます。

指定された色の境界が必要であり、画像内で色が存在する場所のバイナリマスクを返します。OpenCV の inRange() 関数は、指定された画像を取得し、指定された上限と下限に基づいて色が現在ある場所のバイナリマスクを返します。

このマスクは、色が検出された画像のサブセットです。

次に、このバイナリマスクに形態学的操作を適用して、不要なノイズをフィルタリングできます。これを実現するために、OpenCV ライブラリの morphologyex() 関数を使用します。

拡張後に侵食を実行して、オブジェクトの小さな穴を閉じます。

また、この作成されたバイナリマスクを使用して、画像に境界を追加する必要があります。

bitwise_and() は、特定のマスクに一致する画像の部分をセグメント化するために使用されます。マスクは mask パラメータを使用して提供されます。

ソース画像のすべてのピクセルを比較し、指定されたマスクの対応するピクセルと一致します。

このセグメント化された画像に境界を追加するには、findContours()drawContours() の 2つのメソッドを使用します。この輪郭は、セグメント化された画像の境界に沿って点を結ぶ曲線と考えることができます。

最初の関数は、指定された画像のすべての輪郭のリストを返します。drawcontours() 関数を使用して輪郭を描画します。

次に、色検出のコードを実装して、次の画像で緑色を見つけましょう。

色検出用のサンプル画像

コード:

import cv2
import numpy as np

img = cv2.imread("img3.jpeg")
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
bound_lower = np.array([25, 20, 20])
bound_upper = np.array([100, 255, 255])

mask_green = cv2.inRange(hsv_img, bound_lower, bound_upper)
kernel = np.ones((7, 7), np.uint8)

mask_green = cv2.morphologyEx(mask_green, cv2.MORPH_CLOSE, kernel)
mask_green = cv2.morphologyEx(mask_green, cv2.MORPH_OPEN, kernel)

seg_img = cv2.bitwise_and(img, img, mask=mask_green)
contours, hier = cv2.findContours(
    mask_green.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)
output = cv2.drawContours(seg_img, contours, -1, (0, 0, 255), 3)

cv2.imshow("Result", output)
cv2.waitKey(0)
cv2.destroyAllWindows()

出力:

Python で OpenCV を使用して検出された緑色

ここで、実装されたコードについて簡単に説明します。

imread() 関数が画像を読み取ります。cvtColor() 関数を使用して、この画像の色空間を BGR から HSV に変換しました。関数内の cv2.COLOR_BGR2HSV パラメーターに注意してください。

次に、上限値と下限値を指定して画像の緑色を検出し、inRange() 関数を使用してバイナリマスクを作成しました。

ノイズは、morphologyEx() 関数を使用してこのマスクから 2 回除去されます。

初めて、cv2.MORPH_CLOSE パラメーターを使用して、黒い部分から白いノイズをフィルター処理しました。そして、2 回目は、cv2.MORPH_CLOSE を使用して、白い部分から黒いノイズをフィルタリングしました。

次に、セグメント化された部分に境界線を描画しました。findContours() を使用してセグメント化されたパーツとその輪郭を決定し、drawContours() メソッドを使用して境界を描画しました。

まとめ

このチュートリアルでは、Python で OpenCV を使用して色検出を実行する方法について説明しました。画像を使って、緑色に一致する部分を検出しました。

これに関連するいくつかのステップがあります。画像を正しい HSV カラースペースに変換し、必要な色のマスクを作成する必要があります。

次に、このマスクからノイズを除去する必要があります。次に、このマスクを元の画像で使用して、検出された部分をセグメント化し、その上に境界線を描画します。

著者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

関連記事 - Python OpenCV