OpenCV(オープン・シー・ブイ)は、画像処理の世界で20年以上使われ続ける。Python で顔認識・モザイク化・画像加工が、たった数行で書けるようになります。今回は5つのステップで、自分の写真を遊んでみよう。
今回のゴール
① 写真を に読み込む ② 顔を自動検出する ③ 検出した顔にモザイクをかける ④ グレースケール・エッジ検出などの加工 ⑤ 自由研究へのヒント
Step 1: OpenCV を使う準備
Colab セルで実行
Python
# OpenCV は Colab に最初から入ってるimport cv2import numpy as npimport matplotlib.pyplot as pltfrom google.colab import files
# Colab に写真をアップロード(ボタンが出るので家族写真でも何でも)uploaded = files.upload()filename = list(uploaded.keys())[0]
# 読み込み(OpenCV は BGR 順なので、表示用に RGB に変換)img_bgr = cv2.imread(filename)img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(8, 6))plt.imshow(img_rgb)plt.axis("off")plt.title("元の写真")plt.show()Step 2: 顔を検出する(Haar Cascade)
「顔だけを四角で囲む」は、Paul Viola と Michael Jones が 2001年に発明した Haar Cascade(ハール カスケード) というアルゴリズムでできます。OpenCV には学習済みモデルが付属。
顔検出して四角で囲む
Python
# OpenCV 内蔵の顔検出モデルを使うface_cascade = cv2.CascadeClassifier( cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
# グレースケールに変換してから検出(顔検出は色情報を使わない)gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
print(f"検出された顔: {len(faces)} 個")
# 検出した顔に四角を描くimg_with_box = img_rgb.copy()for (x, y, w, h) in faces: cv2.rectangle(img_with_box, (x, y), (x+w, y+h), (255, 0, 0), 3)
plt.figure(figsize=(8, 6))plt.imshow(img_with_box)plt.axis("off")plt.title(f"顔検出結果 ({len(faces)} 人)")plt.show()Step 3: 顔にモザイクをかける
プライバシーが心配な写真を に上げる前に、自分でモザイクをかけられる。原理は「顔の部分を低解像度に縮めて、また拡大して戻す」だけ。
顔にモザイクをかける
Python
def mosaic(image, x, y, w, h, ratio=0.05): """顔領域を ratio 倍に縮小→拡大してモザイクにする""" face = image[y:y+h, x:x+w] small = cv2.resize(face, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST) mosaic_face = cv2.resize(small, (w, h), interpolation=cv2.INTER_NEAREST) image[y:y+h, x:x+w] = mosaic_face return image
img_mosaic = img_rgb.copy()for (x, y, w, h) in faces: img_mosaic = mosaic(img_mosaic, x, y, w, h, ratio=0.05)
plt.figure(figsize=(8, 6))plt.imshow(img_mosaic)plt.axis("off")plt.title("プライバシー保護版")plt.show()Step 4: 画像処理いろいろ
グレースケール / 反転 / ぼかし / エッジ検出
Python
# 4種類の加工を一気にgray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)inverted = 255 - img_rgbblurred = cv2.GaussianBlur(img_rgb, (15, 15), 0)edges = cv2.Canny(gray, 50, 150)
fig, axes = plt.subplots(2, 2, figsize=(11, 8))axes[0, 0].imshow(gray, cmap="gray"); axes[0, 0].set_title("グレースケール"); axes[0, 0].axis("off")axes[0, 1].imshow(inverted); axes[0, 1].set_title("色反転(ネガ)"); axes[0, 1].axis("off")axes[1, 0].imshow(blurred); axes[1, 0].set_title("ぼかし(ガウシアン)"); axes[1, 0].axis("off")axes[1, 1].imshow(edges, cmap="gray"); axes[1, 1].set_title("エッジ検出(Canny)"); axes[1, 1].axis("off")plt.tight_layout()plt.show()Step 5: 自分の名前のスタンプを画像に貼る
画像に文字を入れる
Python
img_signed = img_rgb.copy()text = "by Yamada"
# 左下にテキストh, w = img_signed.shape[:2]cv2.putText(img_signed, text, (20, h - 20), cv2.FONT_HERSHEY_DUPLEX, 1.5, (255, 255, 255), 3)
plt.figure(figsize=(8, 6))plt.imshow(img_signed)plt.axis("off")plt.show()自由研究のヒント
- 目だけ検出:`haarcascade_eye.xml` を使うと目の位置が取れる。目線を黒帯で消す機能を作ろう
- 笑顔検出:`haarcascade_smile.xml` で「笑顔のときだけ撮影するカメラ」
- 動画への応用:1枚の画像と同じことをビデオの各フレームに適用すると、「リアルタイム顔検出」になる
- 色の置換:「赤い服を青に変える」など、色域でフィルタしてから書き換える
- 機械学習版:Haar Cascade は古典手法。最新は MTCNN や YOLO で精度がグッと上がる
次回予告
EP.09 は自然言語処理。文章の感情分析を作ります。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。