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

OpenCVで画像の輪郭を検出する方法【Pythonサンプルコード付き】

本記事では、OpenCVを使用して画像内の輪郭(コンタ)を検出する方法を解説します。輪郭とは、同じ色や明るさ(輝度)を持つ連続した点をつなげた曲線のことであり、形状分析や物体検出・認識において非常に有用なツールです。

元画像

OpenCVで画像の輪郭を検出する方法【Pythonサンプルコード付き】

処理の流れ(アルゴリズム)

輪郭検出は以下の手順で行います。

  1. OpenCVをインポートする
  2. matplotlibをインポートする
  3. 画像を読み込む
  4. BGR形式からRGB形式に変換する
  5. RGB画像をグレースケールに変換する
  6. 画像に対して閾値処理(二値化)を行う
  7. findContoursで輪郭を検出する
  8. drawContoursで輪郭を描画する
  9. 結果を表示する

サンプルコード

import cv2
import matplotlib.pyplot as plt

image = cv2.imread('testimage.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
ret, binary = cv2.threshold(gray, 127,255, cv2.THRESH_BINARY_INV)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

image = cv2.drawContours(image, contours, -1, (0,255,0), 2)
plt.imshow(image)
plt.show()

コードのポイント解説

  • cv2.cvtColor:OpenCVは画像をBGR形式で読み込むため、matplotlibで正しく表示するにはRGB形式への変換が必要です。
  • cv2.threshold:グレースケール画像に対し閾値127で二値化します。THRESH_BINARY_INVを指定することで、背景と対象が反転され、輪郭検出に適した画像になります。
  • cv2.findContours:二値化画像から輪郭を抽出します。RETR_TREEはすべての輪郭の階層構造を取得し、CHAIN_APPROX_SIMPLEは輪郭点を圧縮してメモリを節約します。
  • cv2.drawContours:第4引数の-1ですべての輪郭を描画し、緑色(0,255,0)、線幅2で表示しています。

実行結果

OpenCVで画像の輪郭を検出する方法【Pythonサンプルコード付き】

このように、わずか数行のコードで画像内の物体の輪郭を緑色の線として可視化できます。輪郭検出は、物体の面積計算、外接矩形の取得、形状マッチングなど、さまざまな画像処理タスクの基礎となる重要な技術です。

  1. Pythonで理解する畳み込みニューラルネットワーク(CNN)の基礎とSobelフィルタによるエッジ検出

    画像認識はかつて、線形回帰や類似度の比較といった、より単純な手法によって行われていました。その結果は決して良いものではなく、手書き文字のアルファベットを認識するという単純なタスクさえ困難でした。畳み込みニューラルネットワーク(CNN)は、人間が画像を知覚する際の脳の神経活動を緩やかに模倣する、計算コストの低い手法を提供することで、従来のアプローチから一歩進んだ存在となっています。畳み込みニューラルネットワーク(CNN)の概要人間がさまざまな物体を認識できるようになる過程と非常に似ていて、コンピュータのアルゴリズムも、入力を汎化し、初めて見る画像に対して判断を下せるようになるまでに、何百万もの画

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

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