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)
ここの第二引数の値によって白黒エリアが変わるそうです。
出力結果
使用した元画像がこちら
図1:元画像
thresholdを使った結果画像がこちら
図2:63の時の画像
図3:30の時の画像
図4:120の時の画像
数値を上げるほど元画像がわかりやすくなっている印象。
最終的に元画像に輪郭を描写した画像がこちら
図5:輪郭を描写した画像(引数120の時)
輪郭線の色はおそらく
#輪郭書き込み contimg = cv2.drawContours(im,contours,-1,(0,255,0),3)
ここの第四引数で決定しているようですね。
終わりに
これをカメラ映像でリアルタイムに検知できるようにするのが次の目標かな?