コラム

製造業DXやAI・画像処理技術に関する基礎知識から、現場での実践的な活用ノウハウまで。
エンジニア視点での技術解説や、業界の最新トレンドを発信します。
TOP > コラム > ジャガイモで学ぶ!OpenCV外観検査入門② ~サイズ選別~

ジャガイモで学ぶ!OpenCV外観検査入門② ~サイズ選別~

はじめに

製造現場で発生する不良は、「色」だけではありません。例えば、「規定のサイズより大きい」「規格外の小さなものが混ざっている」といったケースです。 こうした「サイズ」に関する検査も、目視では大きな負担がかかります。さらに、疲労による見逃しも発生しやすいポイントではないでしょうか。

第2回となる本記事では、この「サイズ(面積)による選別」をテーマに解説します。具体的には、Pythonの画像処理ライブラリである「OpenCV」を使って、「サイズ不足で不良品」を弾く仕組みを、ジャガイモを例に紐解いていきましょう。

この記事でわかること

  • コンピューターを使った簡単な「面積(サイズ)」検出の手法
  • 製造業の現場で「サイズ・寸法検査」がどのように活用されるか

この記事はこんな方におすすめ

  • 目視検査の課題に直面している製造現場の責任者の方
  • 現場のDXを推進したいが、画像処理の具体的な仕組みや応用イメージが掴めていない企画・推進担当者の方

人間とコンピュータの「大きさ」の測り方の違い

人間はパッと見て「これは大きい」「これは小さい」と経験から判断できます。しかし、コンピュータには「大きさ」という概念がありません。コンピュータが理解できるのは、画面上の「画素(ピクセル)の数」です。

そこで、以下のステップで「大きさ」を定義します。

  1. 二値化: 画像をぼかし、ノイズ(砂利)除去と穴埋め処理を行って、ジャガイモの形をきれいに抽出する。
  2. 面積計算: 輪郭の内側に「ピクセルがいくつ詰まっているか」を数える。
  3. 判定:この「面積(ピクセル数)」にあらかじめ「しきい値(ボーダーライン)」を決めておくことで、サイズの自動選別が可能になります。

ジャガイモの「サイズ」で選別する

今回は、サイズが混ざった画像を例にします。

ロジックの概要:

  1. まず、画像からジャガイモの領域を抽出する。
  2. 次に、それぞれの面積(ピクセル数)を計算する。
  3. 最後に、面積に応じて以下のように判定し、枠の色やラベルを変える。
    • 大サイズ(青): 90,000px 以上 → OK
    • 中サイズ(緑): 60,000px 以上 → OK
    • 小サイズ(赤): 60,000px 未満 → NG/規格外
      ※今回指定したピクセル数は例です。

このように、OpenCVの二値化処理と、輪郭抽出による面積計算を組み合わせることで、私たちの目視検査と同じように、定量的な基準に基づく「サイズ別の自動選別」に成功しました。

実際のコード(Python / OpenCV)

Google Colab等で動作するサンプルコードです。

import cv2
import numpy as np
from google.colab.patches import cv2_imshow

# 1. 画像読込と前処理
img = cv2.imread('potatoes_mix.png') 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (15, 15), 0)
_, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 2. ノイズ除去(砂利消し)と穴埋め(ジャガイモ復元)
# オープニングで細かい砂利を消し、クロージングで内部の穴を埋める
thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, np.ones((5, 5), np.uint8))
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, np.ones((15, 15), np.uint8))

print("【処理過程:二値化マスク(ここから面積を計算します)】")
cv2_imshow(thresh)

# 3. 輪郭検出と判定ループ
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
result_img = img.copy()

for c in contours:
    area = cv2.contourArea(c)
    if area < 20000: continue # 小さい砂利ノイズは無視

    x, y, w, h = cv2.boundingRect(c)
    
    # サイズ判定 (L:青 / M:緑 / S:赤)
    if area >= 90000:   color, label = (255, 0, 0), "L"
    elif area >= 60000: color, label = (0, 255, 0), "M"
    else:               color, label = (0, 0, 255), "S"

    # 描画
    cv2.rectangle(result_img, (x, y), (x+w, y+h), color, 3)
    cv2.putText(result_img, f"{label}:{int(area)}", (x, y-10), 
                cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 2)

print("【サイズ選別結果】")
cv2_imshow(result_img)

製造現場への応用:ジャガイモの選別は「工場の目」と同じ

今回実践した「ジャガイモの大きさを測って選別する」という技術は、実際の製造現場でも全く同じロジックで活用されています。したがって、以下のように、「面積(ピクセル数)による定量的な判定」は、品質管理における寸法検査の基礎となります。

業界検査の種類現場での検知対象
食品工場割れ・欠け検知クッキーやせんべいの割れ(面積不足)、ドーナツの成形不良
金属加工穴あけもれ確認プレス部品の穴の有無(穴の面積が0なら加工漏れと判定)
樹脂・ゴムバリ(はみ出し)検知成形品の輪郭からはみ出した余分なバリの有無。

現場導入の「壁」を感じていませんか?

ここまでOpenCVによるサイズ検知(面積計算)の有用性をお伝えしてきましたが、いざ工場のラインに導入しようとすると、以下のような「壁」にぶつかることがあります。

  • 対象物の重なり:製品同士が接触していると、1つの大きな塊として誤認識してしまい、正しく計測できない。
  • 撮影環境の変動:コンベアの振動やカメラ距離のわずかな変化で、ピクセル数が変わり誤判定してしまう。
  • 複雑な良否判定:単純な面積だけでなく、「ヒゲ状のバリ」や「微細な欠け」など、数値化しにくい形状も見たい。

OpenCVのルールベース手法は高速で明確ですが、こうした「重なり」や「環境変化」には弱い側面があります。もし、こうしたこうした課題で導入を躊躇されているなら、「AI(ディープラーニング)」の活用が解決の鍵になります。

ムクイルについて

株式会社ムクイルでは、お客さまの要件に合わせて、システムを柔軟にカスタマイズ可能です。画像処理や画像解析の導入をお考えの企業さまは、ぜひムクイルにご相談ください。システムの導入から運用まで、最先端の技術と豊富な実績を活かしてお客さまの課題をサポートいたします。

お問い合わせはこちらから

導入のご相談やデモのご依頼は、下記よりお気軽にお寄せください。

コンタクト

お問い合わせ

コンタクト