画像処理において、物体の輪郭を検出し、その輪郭に基づいて形状をフィッティングするのはよく行われる手法です。特に楕円フィッティングは、物体の回転やスケール変化に対して比較的ロバストであり、特徴的な形状を表現するために便利です。本記事では、PythonとOpenCVを使用して楕円フィッティングを行う方法について詳しく説明します。
1. 必要なライブラリのインポート
まず、必要なライブラリをインポートします。OpenCVとNumPyを使います。OpenCVは画像処理、NumPyは配列操作に役立ちます。
import cv2
import numpy as np
2. 画像の読み込みとグレースケール変換
次に、解析対象となる画像を読み込み、グレースケールに変換します。グレースケール化することで、画像の情報量を減らし、エッジ検出を行いやすくします。
# 入力画像の読み込み
image = cv2.imread("input.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ここでinput.jpgは解析対象の画像ファイルのパスです。
3. エッジ検出
エッジ検出にはCanny法を使います。Cannyエッジ検出は、画像内のエッジ(急激な輝度の変化部分)を抽出する手法です。OpenCVのcv2.Canny関数を使ってエッジを抽出します。
# エッジ検出 (Canny)
edges = cv2.Canny(gray, 100, 200)
ここで、100と200はCannyエッジ検出の閾値です。
4. 輪郭検出
次に、エッジから輪郭を検出します。輪郭検出は、画像中の連続したエッジを集めて輪郭として扱う処理です。cv2.findContours関数を使用し、抽出したエッジから輪郭を検出します。
# 輪郭の検出
contours, _ = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.RETR_TREEは、階層的な輪郭情報を取得するためのモードです。cv2.CHAIN_APPROX_SIMPLEは、輪郭の近似法を指定しており、輪郭を単純化してメモリ効率を向上させます。
5. 楕円フィッティング
輪郭が取得できたら、次は各輪郭に対して楕円をフィッティングしていきます。楕円フィッティングは、輪郭が5点以上ある場合にcv2.fitEllipse関数を使って実行できます。
# 楕円フィッティングの処理
for contour in contours:
# 輪郭が5点以上の場合のみ楕円フィッティングが可能
if len(contour) >= 5:
ellipse = cv2.fitEllipse(contour)
cv2.ellipse(image, ellipse, (0, 255, 0), 2) # 楕円を描画
ここでは、輪郭が5点未満のものはスキップし、楕円フィッティングを行える輪郭だけに処理を適用します。また、フィッティング結果の楕円は、cv2.ellipseを使って描画しています。この関数に楕円パラメータと色、線の太さを指定して、画像に楕円を描画します。
6. 結果の表示
最後に、処理結果をウィンドウに表示して、エッジ検出と楕円フィッティングの結果を確認します。
# 結果を表示
cv2.imshow("Ellipses", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imshowで画像を表示し、cv2.waitKey(0)でキーが押されるまでウィンドウを開いたままにします。cv2.destroyAllWindows()はすべてのOpenCVウィンドウを閉じます。