ジャガイモで学ぶ!OpenCV外観検査入門② ~サイズ選別~
はじめに
製造現場で発生する不良は、「色」だけではありません。例えば、「規定のサイズより大きい」「規格外の小さなものが混ざっている」といったケースです。 こうした「サイズ」に関する検査も、目視では大きな負担がかかります。さらに、疲労による見逃しも発生しやすいポイントではないでしょうか。
第2回となる本記事では、この「サイズ(面積)による選別」をテーマに解説します。具体的には、Pythonの画像処理ライブラリである「OpenCV」を使って、「サイズ不足で不良品」を弾く仕組みを、ジャガイモを例に紐解いていきましょう。
この記事でわかること
- コンピューターを使った簡単な「面積(サイズ)」検出の手法
- 製造業の現場で「サイズ・寸法検査」がどのように活用されるか
この記事はこんな方におすすめ
- 目視検査の課題に直面している製造現場の責任者の方
- 現場のDXを推進したいが、画像処理の具体的な仕組みや応用イメージが掴めていない企画・推進担当者の方
人間とコンピュータの「大きさ」の測り方の違い
人間はパッと見て「これは大きい」「これは小さい」と経験から判断できます。しかし、コンピュータには「大きさ」という概念がありません。コンピュータが理解できるのは、画面上の「画素(ピクセル)の数」です。
そこで、以下のステップで「大きさ」を定義します。
- 二値化: 画像をぼかし、ノイズ(砂利)除去と穴埋め処理を行って、ジャガイモの形をきれいに抽出する。
- 面積計算: 輪郭の内側に「ピクセルがいくつ詰まっているか」を数える。
- 判定:この「面積(ピクセル数)」にあらかじめ「しきい値(ボーダーライン)」を決めておくことで、サイズの自動選別が可能になります。
ジャガイモの「サイズ」で選別する
今回は、サイズが混ざった画像を例にします。


ロジックの概要:
- まず、画像からジャガイモの領域を抽出する。
- 次に、それぞれの面積(ピクセル数)を計算する。
- 最後に、面積に応じて以下のように判定し、枠の色やラベルを変える。
- 大サイズ(青): 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(ディープラーニング)」の活用が解決の鍵になります。
ムクイルについて
株式会社ムクイルでは、お客さまの要件に合わせて、システムを柔軟にカスタマイズ可能です。画像処理や画像解析の導入をお考えの企業さまは、ぜひムクイルにご相談ください。システムの導入から運用まで、最先端の技術と豊富な実績を活かしてお客さまの課題をサポートいたします。
お問い合わせはこちらから
導入のご相談やデモのご依頼は、下記よりお気軽にお寄せください。