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)