しぐれの戯言箱

技術的なメモ書き、ポケモンの調整記事、ソシャゲ奮闘記…etc

python画像処理日記【OpenCVで画像の輪郭検出】

はじめに

こんにちは、しぐれです。
現在、図形(四角形)を識別するようなモノを作りたいのですが、まずは輪郭の識別から、ということらしいです。
そこで、画像から輪郭を抽出し、描画できるようなモノを作りました。

以下ソースコード


ソースコード

import numpy as np
import cv2
import os
from PIL import Image
import re
import matplotlib.pyplot as plt

#画像読み込み
im = cv2.imread('ok.jpg')
#グレイスケール化
im_gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
#ガウシアンブラーをかける
#im_blur = cv2.GaussianBlur(im_gray,(11,11),0)
#thresholdを使って白黒エリアの決定
ret, thresh = cv2.threshold(im_gray,63,255,cv2.THRESH_BINARY)

#白黒画像の表示
cv2.imshow('thresh.jpg',thresh)

#輪郭の検出
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

#輪郭書き込み
contimg = cv2.drawContours(im,contours,-1,(0,255,0),3)

#最終表示
cv2.imwrite('final.jpg',contimg)
cv2.imshow('final.jpg',contimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

特に

#thresholdを使って白黒エリアの決定
ret, thresh = cv2.threshold(im_gray,63,255,cv2.THRESH_BINARY)

ここの第二引数の値によって白黒エリアが変わるそうです。


出力結果

使用した元画像がこちら
f:id:shiguderika:20191108142700j:plain
図1:元画像



thresholdを使った結果画像がこちら

f:id:shiguderika:20191108142323j:plain
図2:63の時の画像

f:id:shiguderika:20191108142458j:plain
図3:30の時の画像

f:id:shiguderika:20191108142606j:plain
図4:120の時の画像

数値を上げるほど元画像がわかりやすくなっている印象。



最終的に元画像に輪郭を描写した画像がこちら

f:id:shiguderika:20191108142946j:plain
図5:輪郭を描写した画像(引数120の時)

輪郭線の色はおそらく

#輪郭書き込み
contimg = cv2.drawContours(im,contours,-1,(0,255,0),3)

ここの第四引数で決定しているようですね。


終わりに

これをカメラ映像でリアルタイムに検知できるようにするのが次の目標かな?