openCVで輪郭抽出をやってみた

はじめに

こんにちは、でめきんです。

今回はopenCVを使って輪郭を識別することをやってみたいと思います。

今回の輪郭抽出はDICOM画像ではなく、以下のjpg画像を用います。


広告
デル株式会社

輪郭抽出の手順

  1. 画像の読み込み
  2. 画像の2値化
  3. 閾値設定を行う
  4. 領域を抽出
  5. 領域を重ね合わせ
  6. 画像表示


画像の読み込み

openCVの画像読み込みは

img = cv2.imread(“img.JPG”)


画像の2値化  cv2.cvtColor

領域抽出をする際に、色情報があると領域の境が曖昧になってしまいますのでグレイスケールに変換します。

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


閾値設定  cv2.threshold

閾値設定をして画像の領域の調整します。

ret, thresh = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)

閾値設定とは、第2引数(上のコードでは’127’)よりも大きい値が第3引数の値(255)に第2引数よりも小さい数字は0に置き換わります。

OpenCV 画像の閾値処理 チュートリアル



領域を抽出  cv2.findContours

いよいよ本題に入っていきます。

領域の抽出は一度画像上のすべての領域を検出します。その後、表示の際に大きさであったり、輪郭線の長さであったりで抽出条件を指定して表示します。

(私は、初めから抽出条件を指定して領域を探し出すものと勘違いしていたので理解するのに苦労しました・・・・そんな人はいないかな・・・・)

まずは、領域抽出

ret, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

第1引数は画像を指し、第2引数に抽出方法、第3引数として近似手法を指定します。

抽出方法

cv2.RETR_EXTERNAL輪郭のうち、最も外側のみ抽出
cv2.RETR_LIST全ての輪郭を抽出
cv2.RETR_CCOMP全ての輪郭を2レベルの階層に分けて出力
cv2.RETR_TREE抽出した内側の輪郭も抽出


近似方法

cv2.CHAIN_APPROX_NON輪郭上の全点をの情報を保持
cv2.CHAIN_APPROX_SIMPLE輪郭を圧縮し情報を保持


広告
HP Directplus -HP公式オンラインストア-

領域を重ね合わせ cv2.drawContours

領域の抽出が済みましたら、今度は元画像との重ね合わせとなります。

cv2.drawContours

cv2.drawContours(img, contours, 3, color, 2)

第1引数重ね合わせる画像
第2引数領域抽出したリスト
第3引数リストの中の何番目を表示するか
(すべてを表示する場合は-1を指定します。)
第4引数線のカラー
第5引数線の太さ


広告
BTOパソコン・パソコン関連商品がお買い得!パソコン工房のセール

画像表示

cv2.imshow(‘conturing’,img)

と忘れてはいけない

cv2.waitKey(0)
cv2.destroyAllWindows()


コード

左が元画像 右側が領域抽出して画像に重ね合わせたもの


最後に

いかがでしたか?

今回は概要となりますが、今後機会があれば、もう少し詳しく記事にしていきたいと思います。

お疲れ様でした。

広告
上新電機 パソコン買取サービス
  • このエントリーをはてなブックマークに追加