Pythonで画像認識をして個数をカウントする方法
Pythonで画像内のオブジェクトの個数をカウントするためには、OpenCVライブラリが非常に有効です。特に輪郭検出機能を使用することによって、物体の形状を特定し個数を正確にカウントできます。画像処理において基本的な手順は、まず入力画像をグレースケールに変換し、次にノイズ除去のためにブラー処理を適用した後、二値化処理によって対象物と背景を明確に区別する必要があります。
輪郭検出は画像内の物体を識別する強力な手法であり、cv2.findContours()関数を使用することによって実装できます。この関数は処理された二値画像を入力とし、検出された全ての輪郭を階層情報とともに返すため、単純に返された輪郭のリストの長さを取得することで画像内の物体数を効率的に把握できます。
画像認識においては前処理の質が結果の精度に大きく影響するため、適切なしきい値の設定と輪郭の抽出条件の調整が必要です。特に物体が互いに接触している場合や背景との区別が難しい場合には、モルフォロジー演算(膨張や収縮)を適用することによって、より正確な輪郭抽出が可能となりオブジェクトの過剰検出や検出漏れを防げます。
【サンプルコード】
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 画像を読み込む
image = cv2.imread('objects.jpg')
# グレースケールに変換
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# ガウシアンブラーでノイズ除去
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# 二値化
_, thresh = cv2.threshold(blur, 127, 255, cv2.THRESH_BINARY)
# 輪郭検出
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 結果の可視化
result = image.copy()
cv2.drawContours(result, contours, -1, (0, 255, 0), 2)
object_count = len(contours)
cv2.putText(result, f'Count: {object_count}', (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
# 結果表示(OpenCVの色順はBGR、matplotlibはRGB)
result_rgb = cv2.cvtColor(result, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(10, 8))
plt.imshow(result_rgb)
plt.title(f'検出されたオブジェクト数: {object_count}')
plt.axis('off')
plt.show()
【実行結果】
検出されたオブジェクト数: 5
[画像には5つのオブジェクトが緑色の輪郭線で囲まれ、各オブジェクトがカウントされていることが表示されます]
画像認識で得られる色彩情報を活用して個数をカウントする方法
色彩情報を活用したオブジェクトカウントでは、HSV色空間への変換が極めて効果的であり、RGB色空間よりも色相(Hue)、彩度(Saturation)、明度(Value)の分離によって特定の色を持つオブジェクトを正確に抽出できます。HSV色空間では色相は0〜179の範囲で表現され、赤色なら0〜10および170〜179、青色なら100〜130というように色相範囲を指定することによって、特定の色を持つオブジェクトだけを精密に抽出可能です。
マスク画像の生成は色彩ベースの物体検出における重要なステップであり、cv2.inRange()関数を使用することによって指定した色相範囲内の画素だけを含む二値マスクを作成できます。得られたマスク画像に対してモルフォロジー演算を適用することによって、ノイズを除去し連結領域を適切に分離することが可能となり、より正確なオブジェクトカウントが実現できます。
異なる色のオブジェクトをそれぞれカウントしたい場合は、各色に対応するマスクを個別に生成し、それぞれのマスクから輪郭検出を行うアプローチが有効です。このアプローチでは複数の色のオブジェクトが混在する複雑な画像においても、色ごとの個数を正確に把握でき、色分布の分析やカラーベースの選別システムなどの応用において優れた結果を提供します。
【サンプルコード】
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 画像読み込み
image = cv2.imread('colored_objects.jpg')
# HSV色空間に変換
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 赤色の範囲定義(HSVでは赤は0付近と180付近の2箇所)
lower_red1 = np.array([0, 100, 100])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([160, 100, 100])
upper_red2 = np.array([179, 255, 255])
# 青色の範囲定義
lower_blue = np.array([100, 100, 100])
upper_blue = np.array([130, 255, 255])
# 各色のマスク作成
red_mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
red_mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
red_mask = cv2.bitwise_or(red_mask1, red_mask2) # 赤色マスクの統合
blue_mask = cv2.inRange(hsv, lower_blue, upper_blue)
# モルフォロジー演算でノイズ除去
kernel = np.ones((5, 5), np.uint8)
red_mask = cv2.morphologyEx(red_mask, cv2.MORPH_OPEN, kernel)
blue_mask = cv2.morphologyEx(blue_mask, cv2.MORPH_OPEN, kernel)
# 輪郭検出と個数カウント
red_contours, _ = cv2.findContours(red_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
blue_contours, _ = cv2.findContours(blue_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 結果の可視化
result = image.copy()
# 赤色オブジェクトの輪郭を描画
cv2.drawContours(result, red_contours, -1, (0, 0, 255), 2) # 赤色で描画
# 青色オブジェクトの輪郭を描画
cv2.drawContours(result, blue_contours, -1, (255, 0, 0), 2) # 青色で描画
# カウント情報表示
red_count = len(red_contours)
blue_count = len(blue_contours)
cv2.putText(result, f'赤: {red_count}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv2.putText(result, f'青: {blue_count}', (10, 70), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
# 結果表示
result_rgb = cv2.cvtColor(result, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(10, 8))
plt.imshow(result_rgb)
plt.title(f'赤色オブジェクト: {red_count}個, 青色オブジェクト: {blue_count}個')
plt.axis('off')
plt.show()
【実行結果】
赤色オブジェクト: 3個, 青色オブジェクト: 2個
[画像には赤色の輪郭線で囲まれたオブジェクトが3つ、青色の輪郭線で囲まれたオブジェクトが2つ表示されています]
機械学習で画像認識をして個数をカウントする方法
機械学習を用いた画像内のオブジェクト検出では、YOLOv5(You Only Look Once)などの最新の物体検出アルゴリズムが高い精度と処理速度を誇り、従来の画像処理技術では困難だった複雑な背景や重なり合ったオブジェクトの検出が可能になります。YOLOは単一のニューラルネットワークで画像全体を一度に処理し、複数のバウンディングボックスと各クラスの確率を同時に予測することによって、リアルタイム処理にも適した効率的な検出システムを実現しています。
機械学習モデルを使用するには適切なライブラリのインストールが必要であり、PyTorchやTensorFlowなどのディープラーニングフレームワークと事前学習済みのモデルウェイトを組み合わせて利用します。特にPyTorchベースのYOLOv5はtorch.hub.load()を使用してインストールでき、事前学習済みの重みを読み込むことによって、カスタムトレーニングなしで一般的なオブジェクト(人、車、動物など)を即座に検出できる利便性があります。
検出結果はクラス別にフィルタリングでき、各検出オブジェクトの位置(バウンディングボックス)、クラス、確信度スコアが得られます。これらの情報を活用することによって、特定のクラスに属するオブジェクトの個数を正確にカウントするだけではなく、その空間的分布や配置も分析可能であり、複雑な画像解析タスクにおいて従来の画像処理手法よりも優れた結果を提供します。
【サンプルコード】
import torch
import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import pandas as pd
# YOLOv5モデルを読み込み
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
# 入力画像の読み込み
img_path = 'street_scene.jpg'
img = Image.open(img_path)
# 推論実行
results = model(img)
# 結果をパンダスDataFrameとして取得
results_df = results.pandas().xyxy[0]
# 各クラスの個数をカウント
class_counts = results_df['name'].value_counts()
# 検出結果を可視化
img_cv = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
result_img = img_cv.copy()
# 各検出オブジェクトに枠と名前を描画
for _, row in results_df.iterrows():
x1, y1, x2, y2 = int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax'])
conf = row['confidence']
label = f"{row['name']} {conf:.2f}"
# クラスごとに異なる色を割り当て
color_hash = int(hash(row['name'])) % 256
color = (color_hash, 255 - color_hash, 128)
# バウンディングボックスを描画
cv2.rectangle(result_img, (x1, y1), (x2, y2), color, 2)
cv2.putText(result_img, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
# カウント情報を画像に追加
y_pos = 30
for class_name, count in class_counts.items():
color_hash = int(hash(class_name)) % 256
color = (color_hash, 255 - color_hash, 128)
text = f"{class_name}: {count}"
cv2.putText(result_img, text, (10, y_pos),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2)
y_pos += 30
# 結果表示
result_img_rgb = cv2.cvtColor(result_img, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(12, 10))
plt.imshow(result_img_rgb)
plt.title('YOLOv5によるオブジェクト検出結果')
plt.axis('off')
plt.show()
# 各クラスの検出数をテーブルで表示
print("検出されたオブジェクトのカウント:")
print(class_counts)
【実行結果】
検出されたオブジェクトのカウント:
person 8
car 6
bus 2
truck 1
Name: count, dtype: int64
[画像には検出された各オブジェクトの周りにバウンディングボックスが描画され、各クラスのカウント情報が表示されています]※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。
ITやプログラミングに関するコラム
Gitでブランチ(branch)を作成する方法
crontabの書き方
PDFをExcelに変換する方法
Excelでプルダウンを設定する方法
エクセルでページ区切りを設定する方法
Markdownの取り消し線の書き方
ラズベリーパイでできること9選
Gitでbranch(ブランチ)を削除する方法をローカル・リモート別に解説
git addの取り消し方法を状況別に解説
CSSのstickyプロパティでWebサイトに固定要素を実装する方法
ITやプログラミングに関するニュース
アイアール技術者教育研究所がエクセルギー解析計算ウェビナーを開催、省エネと環境負荷低減に貢献
フラー株式会社がアプリ市場トレンド解説ウェビナーを3月25日に開催、成長アプリの共通項とデータ活用を解説
株式会社BOTANICOが2026年版X運用最新戦略ウェビナーを開催、成果につなげる資産型運用を解説
AIストーム株式会社がOpenClaw活用セミナーを開催、AIエージェントがビジネス現場を変革
株式会社オロが建設コンサルティング業向けウェビナーを開催、技術部門の損益可視化を支援
アルティウスリンク株式会社が経理向けBPO活用ウェビナーを開催、課題解決と業務効率化を支援
株式会社日本計画研究所がAI時代のインフラセミナー開催、GPUとデータセンターの課題を解説
株式会社カウンターワークスがリーシング業務AI活用ウェビナー開催、既存ツールでAIエージェント実践
株式会社セキドがDJI産業機セミナーを福井で開催、3Dデータ活用と機材選定を無料解説
株式会社ナビットが補助金活用ウェビナーを開催、販促費削減と集客力向上を解説
