Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonとOpenCVで画像の輪郭を検出・描画する方法

画像解析を行う際には、Python向けのオープンソースライブラリ「OpenCV(Open Source Computer Vision Library)」が広く利用されています。OpenCVをインストールした後、プログラム内では「cv2」という名前でインポートして使用します。

本記事では、画像ファイルに含まれる輪郭(コンタ)を検出し、描画する方法を解説します。輪郭とは、画像内の物体の形状を把握するために重要な情報で、「同じ明るさ(輝度)を持つ領域の境界上にある点を結んだ線」として定義されます。OpenCVでは、輪郭の検出にfindContours関数、輪郭の描画にdrawContours関数を使用します。

輪郭検出・描画関数の構文

cv2.findContours() ― 輪郭の検出

cv2.findContours(image, mode, method)

各引数の意味は以下の通りです。

  • image:輪郭を検出する入力画像(二値画像が推奨)
  • mode:輪郭の取得モード(例:cv2.RETR_EXTERNAL は最も外側の輪郭のみ取得、cv2.RETR_LIST はすべての輪郭を取得)
  • method:輪郭の近似手法(例:cv2.CHAIN_APPROX_NONE はすべての点を保持、cv2.CHAIN_APPROX_SIMPLE は冗長な点を圧縮して保持)

cv2.drawContours() ― 輪郭の描画

cv2.drawContours(img, contours, contourIdx, color, thickness)
  • img:描画対象となる画像
  • contours:検出されたすべての輪郭
  • contourIdx:描画する輪郭のインデックス。負の値を指定すると、すべての輪郭が描画される
  • color:輪郭線の色(BGR形式で指定)
  • thickness:輪郭線の太さ

サンプルコード

以下の例では、次の画像を入力として使用し、画像内の図形の周囲に輪郭を描画します。

PythonとOpenCVで画像の輪郭を検出・描画する方法

この画像には3つの図形が含まれています。以下のプログラムを実行すると、すべての図形、または特定の図形だけに輪郭を描くことができます。

処理の流れは「画像の読み込み → 色空間の変換 → Canny法によるエッジ検出 → 輪郭の検出 → 輪郭の描画」となります。

import cv2

# 画像を読み込む
image = cv2.imread("path to image file")

# カラースペースを変換する
LUV = cv2.cvtColor(image, cv2.COLOR_BGR2LUV)

# Canny法でエッジを検出する
edges = cv2.Canny(LUV, 10, 100)

# 輪郭を検出する
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# 検出された輪郭の数を表示する
print("Number of Contours is: " + str(len(contours)))

# インデックス0と2の輪郭に黄色い枠線を描画する
cv2.drawContours(image, contours, 0, (0, 230, 255), 6)
cv2.drawContours(image, contours, 2, (0, 230, 255), 6)

# 輪郭を描画した画像を表示する
cv2.imshow('Contours', image)
cv2.waitKey(0)

補足: OpenCVのバージョンによって、findContoursの戻り値の数が異なります。OpenCV 4.x系では上記のように戻り値は2つですが、3.x系では3つ返されるため、環境に合わせて書き方を調整してください。

実行結果

上記のコードを実行すると、以下のような結果が得られます。

Number of Contours found = 3

また、輪郭が描画された出力画像は以下のようになります。

PythonとOpenCVで画像の輪郭を検出・描画する方法

  1. Python・OpenCVでヒストグラム平坦化を実装する方法|cv2.equalizeHist()の使い方

    ヒストグラム平坦化(Histogram Equalization)とは ヒストグラム平坦化は、画像処理において画像のヒストグラムを利用してコントラストを調整する手法です。 この手法は、多くの画像の全体的なコントラストを向上させる効果があります。特に、画像内の有効なデータが近いコントラスト値で表現されている場合に威力を発揮します。この調整を行うことで、輝度値がヒストグラム上により均等に分布するようになり、局所的にコントラストが低い領域でも高いコントラストを得られるようになります。 OpenCVの cv2.equalizeHist() 関数 OpenCVには、この処理を実行するための関数 cv2

  2. 【Python×OpenCV】画像の収縮(エロージョン)と膨張(ダイレーション)の基本を解説

    本記事では、PythonのOpenCVモジュールを使って、エロージョン(収縮)やダイレーション(膨張)といったモルフォロジー演算(形態学的処理)を実行する方法を解説します。 OpenCVはコンピュータビジョン向けに設計されたオープンソースのライブラリで、もともとはIntelによって開発されました。BSDライセンスのもとで誰でも無料で利用できます。 OpenCVの機能を使うには、まずpipでインストールしておきましょう。 sudo pip3 install opencv-python エロージョン(収縮)とは?仕組みを解説 エロージョンは、前景オブジェクトの境界を削り取っていく処理です。画像内の