前回に続いて画像処理を行いたいと思います。
#使用環境
- google colaboratory
- OpenCV
#輪郭抽出
今回は、前回の内容を用いて輪郭抽出を行いたいと思います。
これが、今回作成したプログラムになります。
import cv2
import numpy as np
from matplotlib import pyplot as plt
src = cv2.imread(img)
#numpy配列化
pixels = np.array(src)
#グレースケール化
plt.gray()
img_gray = cv2.cvtColor(pixels, cv2.COLOR_BGR2GRAY)
#二値化
retval, img_binary = cv2.threshold(img_gray,128, 255, cv2.THRESH_BINARY)
#輪郭抽出
contours,hierarchy=cv2.findContours(img_binary,cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
#抽出した輪郭をオリジナルの画像に描画
img_binary = cv2.drawContours(src, contours, -1, (0,255,0), 8)
#画像の表示
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.imshow(cv2.cvtColor(img_binary, cv2.COLOR_BGR2RGB))
ax1.axis('off')
plt.show()
plt.close()
二値化のしきい値は、画像によって任意で設定してください。
##引数の解説
cv2.findContours
は、輪郭を抽出するためのOpenCVの引数です。
第二引数にcv2.RETR_LIST
とすることで、全輪郭を探査することが可能になります。
また、ここの引数にRETR_EXTERNAL
とすることで、最も外側にある輪郭を表示することができます。
cv2.drawContours
で、抽出した輪郭を描画することができます。今回のプログラムでは、オリジナルの画像に描画しています。
-1, (0,255,0), 8
の、-1
はすべての輪郭の表示を表しています。この数値を変えていくと0,1
などに対応する輪郭を1つずつ表示することができます。8
は、このプログラムで使用した画像には、8つの輪郭が存在しました。したがって8にしています。今回の使用した画像には、-1(全描画)を含めて、0~7までの輪郭が存在しました。ここは、画像によって調整してください。(0,255,0)
はBGRを表しており、今回は、輪郭を緑にして、描画しています。