Pythonで画像処理(OpenCV入門)〜画像認識を体験してみよう〜

はじめに

こんにちは、yamaです!
今回は「Python × OpenCV」を使って、画像認識にチャレンジしてみたいと思います。

以前、画像編集についての記事を書いたのですが、「画像を“見る”だけじゃなくて、どうやって“認識”するのか?」というところにも興味が出てきました。

Python初心者でも扱いやすいOpenCVを使って、顔認識やエッジ検出などの基礎的な処理を体験してみましょう!


やりたいこと

今回のブログでは、次のような画像認識を試します。

1.画像の読み込みと表示
2.エッジ検出(Cannyフィルタ)
3.顔認識(Haar分類器)

「画像認識ってなんか難しそう…」と思うかもしれませんが、OpenCVを使えば意外と簡単に試せます!


準備するもの

ライブラリ

今回使うのは以下のライブラリです:

・opencv-python: 画像の読み込み・表示・処理
・numpy: 画像データの数値処理(行列演算)
・matplotlib: 画像の可視化(表示・比較用)

インポート手順

ターミナルやAnaconda Promptなどで以下のコマンドを実行してください。

bash

pip install opencv-python numpy matplotlib

このライブラリの説明

  • OpenCV: 画像処理ライブラリ。顔認識・物体検出など高機能。
  • NumPy: Pythonの数値計算ライブラリ。画像データを行列として扱う。
  • Matplotlib: グラフ描画ライブラリ。画像の可視化にも便利。

ディレクトリ構成

opencv_demo/
├── main.py
└── sample.jpg

画像ファイル(今回は sample.jpg)をスクリプトと同じフォルダに置いておくと楽です。


コードスクリプト

コードスクリプトの概要

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 画像読み込み
img = cv2.imread('sample.jpg')

# エッジ検出(グレースケールに変換→Cannyフィルタ)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)

# 顔認識(事前に用意されたHaar分類器を使用)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

# 顔の部分に枠を描く
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

# 画像表示(Matplotlib使用)
plt.figure(figsize=(12, 4))

plt.subplot(1, 3, 1)
plt.title("Original")
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.axis('off')

plt.subplot(1, 3, 2)
plt.title("Gray")
plt.imshow(gray, cmap='gray')
plt.axis('off')

plt.subplot(1, 3, 3)
plt.title("Edges")
plt.imshow(edges, cmap='gray')
plt.axis('off')

plt.tight_layout()
plt.show()

実行結果

実行すると、3つの画像が横並びで表示されます:

  • 左:元画像(顔が枠で囲まれている)
  • 中:グレースケール画像
  • 右:エッジ検出画像(輪郭が白く強調)

コード解説

  • cv2.imread(): 画像を読み込みます(BGR形式)
  • cv2.cvtColor(): カラー→グレースケール変換
  • cv2.Canny(): エッジ検出(輪郭を強調)
  • cv2.CascadeClassifier: OpenCVに付属する顔認識用の分類器
  • matplotlib.pyplot: 画像を見やすく表示
 for文の構造解説:
facesには顔検出で得られた複数の顔の座標情報が格納されています
各顔のデータは (x, y, w, h) の形式です

x: 顔の左上のx座標
y: 顔の左上のy座標
w: 顔の幅(width)
h: 顔の高さ(height)


注意点

  • sample.jpg が見つからないとエラーになるので、パスを正しく指定しましょう
  • Haar分類器は顔の向きや明るさによって精度が変わるため、完璧ではありません
  • cv2.imshow() ではなく matplotlib を使う理由は、Jupyter Notebookなどで表示しやすいためです

まとめ

今回は、PythonのOpenCVを使って画像認識の基本を体験してみました!

  • 画像は行列(配列)として扱う
  • NumPyで効率的に処理できる
  • Matplotlibで結果を“見える化”できる
  • Haar分類器を使えば、顔認識も超手軽!

OpenCVは応用範囲が広いので、次は「物体検出」や「動画処理」にもチャレンジしてみたいですね!

コメント

タイトルとURLをコピーしました