OpenCV

画像の二値化

# 閾値の設定
threshold = 125

# 二値化閾値125を超えた画素を白255にする
ret, img_thresh = cv2.threshold(img, threshold, 255, cv2.THRESH_BINARY)

# 画素の確認
plt.imshow(cv2.cvtColor(img_thresh, cv2.COLOR_BGR2GRAY), cmap='gray')
plt.show()

OpenCVは幾つかの閾値処理があり、cv2.THRESH_BINARYはその一つ

輪郭抽出

# ライブラリのインポート
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 画像の読み込み
img_original = cv2.imread('logo.jpg')

# グレースケールに変換
img_gray = cv2.cvtColor(img_original, cv2.COLOR_BGR2GRAY)

# 二値化(閾値150以上の画素を白255にする)
ret, thresh = cv2.threshold(img_gray, 150, 255, 0)

# 輪郭の検出(白い部分255の部分の輪郭を検出する)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 真っ黒の画像を新規作成
img_cnt = np.zeros_like(thresh, dtype=np.uint8)

# そこに輪郭を白255で描写する
img_cnt = cv2.drawContours(img_cnt, contours, -1, 255, 2)

# 画像の確認
plt.imshow(img_cnt, cmap='gray')
plt.show()

輪郭の検出では白い部分(255の部分)の輪郭を検出する

第一引数threshは、輪郭抽出する画像

第二引数cv2.RETR_TREEは輪郭の取得方法(他にもcv2.RETR_CCOMP等がある)

第三引数cv2.CHAIN_APPROX_SIMPLEは輪郭座標の取得方法

cv2.CHAIN_APPROX_NONEであれば、輪郭上のすべての座標を取得

cv2.CHAIN_APPROX_SIMPLEは縦、横、斜め45度方向に完全に直線の部分の輪郭の点を省略する

顔検出

# 画像の読み込み
img_original = cv2.imread('logo.jpg')

# RGB変換
img_rgb = cv2.cvtColor(img_original, cv2.COLOR_BGR2RGB)

# 顔検出ファイルの読み込み
# ファイルはhttps://www.kikagaku.co.jp/kikagaku-blog/python-opencv/より事前にDLすること
cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')

# グレースケールに変換
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)

# 顔の検出
face = cascade,detectMultiScale(img_gray, scaleFactor=1.1, minNeighbor=3, minSize=(30,30))

# 検出した領域を赤い矩形で囲む
for (x, y, w, h) in face:
  cv2.rectangle(img_rgb, (x,y), (x+w,y+h), (200,0,0), 3)
  
# 画像を確認
plt.imshow(img_rgb)