Python OpenCV / 画像から輪郭を検出する方法

まくまく
まくまく
プラグラミング言語「PYTHON」を使ってみよう!!業務自動化・効率化の実例を踏まえ、解説できればと思っています。対象は、プログラムを学び始めた初心者向けとなります。今回はopenCVを用いて画像から輪郭を検出してみようと思います。



使用するのはopenCV

使用するのは、画像処理ライブラリのopenCVです。ここではopenCVがインストールされているのを前提として書き進めていきます。

サンプルコード

import cv2

img = cv2.imread('test.jpg')
img_bit = cv2.bitwise_not(img)
img_gray = cv2.cvtColor(img_bit, cv2.COLOR_BGR2GRAY)
ret,img_th = cv2.threshold(img_gray,10,255,cv2.THRESH_BINARY)

contours, hierarchy = cv2.findContours(img_th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
img_contours = cv2.drawContours(img, contours, -1, (0,0,255),3)

cv2.imwrite('result.jpg',img_contours)

コメント

  • 1行目 OpenCVをインポート
  • 3行目〜6行目 画像読み込み、反転、グレースケール、2値化を実施
  • 8行目「contours,〜」で輪郭を検出
  • 9行目「img_contours = ~」で元の画像に輪郭を描写

元画像


この画像を用いて、輪郭検出します。

処理後(EXTERNAL)


上のプログラムで処理したのがこちら。うまく輪郭を検出することができました。

処理後(LIST)


8行目、「cv2.RETR_EXTERNAL」を「cv2.RETR_LIST」にすると、内部と外部の両方の輪郭を検出することができます。今回の画像で言うと、窓の輪郭が検出できているかどうかです。

EXTERNALは、外部輪郭飲み抽出
LISTは、内部と外部の両方の輪郭を検出

2値化画像


2値化とは、画像を白と黒の2値で表したものです。6行目で2値化処理を行っています。

この2値化がうまくできていないと、その後の処理に影響を及ぼすため、2値化画像は必ず確認をしておきましょう。

「ret,img_th = cv2.threshold(img_gray,10,255,cv2.THRESH_BINARY)」

実際の画像の変化を見ながら、スレッショルド(赤字の数値)を変更して最適な数値を探してください。



タイトルとURLをコピーしました