
Pythonで色解析を試してみた!伊勢塩飴と酒粕飴を画像で判別!
1. はじめに

わー!試食用の飴が混ざっちゃった!


えっ、どんな飴が混ざったの?


常光庵には 伊勢塩飴 と 酒粕飴 っていう、2種類の白い飴があるんだよ。でも見た目がそっくりだから、パッと見ただけじゃわからないよ…


じゃあ、食べて確かめるしか…


「待って!Pythonで色を解析すれば、食べなくても判別できるかも!」

飴の微妙な色の違いをPythonで見分けられるのか?
色解析を使ってチャレンジしてみました!
2. どうやって判別するのか?
この2つの飴はどちらも白っぽいですが、よく見ると微妙に色や質感が違います。

伊勢塩飴(右側)
やや透明感がある
若干青みがかった白
ツルッとした表面
酒粕飴(左側)
不透明でミルキーな白
黄みがかった白
表面がややマット
実物を見ると伊勢塩飴の方がスッキリとした白、酒粕飴の方が濁った白という違いがわかります。
しかし、光の当たり方や背景の影響で肉眼では判別しにくいことも多いです。
そこで、Pythonを使って色を解析し、数値で違いを判断する方法を試してみましょう!
色解析の流れ
画像を読み込む → 飴の写真をPythonで開き、色のデータを取得
飴の部分を抽出する → 画像の中央部分を切り取り、飴の色を分析
色の平均値を計算する → 飴の部分のRGB(赤・緑・青)の平均値を求める
色の特徴を比較する
青の成分が強い → 伊勢塩飴
赤や黄色の成分が強い → 酒粕飴

この方法を使えば、見た目では判別しにくい微妙な色の違いも、数値化することで識別できるようになるはずです!
3. 解析に使うPythonの技術
飴の色を判別するために、以下のPythonの技術を活用します。
1. OpenCV(画像処理)
画像を読み込んで、飴の部分の色を解析するためにOpenCVを使用します。
cv2.imread():画像を読み込む
cv2.cvtColor():画像の色空間を変換(RGB ↔ BGRなど)
cv2.GaussianBlur():ノイズを減らすために画像をぼかす
2. NumPy(数値計算)
画像データから特定部分のピクセル値を取得し、平均値を計算します。
np.mean():選択した範囲のRGB値の平均を求める
np.array():画像のピクセルデータを配列として扱う
3. Matplotlib(可視化)
解析結果をグラフで表示し、色の違いを視覚的に確認します。
plt.imshow():画像を表示する
plt.bar():色の成分(R, G, B)の割合をグラフ化
4. 色の特徴を数値化して判別
RGBの平均値を比較し、飴の種類を推定
青みが強い → 伊勢塩飴
赤や黄色の成分が強い → 酒粕飴
このように、画像処理・数値計算・可視化の技術を組み合わせることで、飴の微妙な色の違いを数値化し、Pythonで識別できるようにします!
4. 実際のPythonコード
以下のPythonコードを使って、画像から飴の色を解析し、伊勢塩飴か酒粕飴かを判別します。
必要なライブラリをインストール
まず、必要なライブラリをインストールしておきます。
pip install opencv-python numpy matplotlib
Pythonコード
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 画像を読み込む(デスクトップの file フォルダ内にある candy.png)
image_path = "file/candy.png"
image = cv2.imread(image_path)
# OpenCVはBGR形式なのでRGBに変換
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 画像の中央部分を切り取って解析
h, w, _ = image.shape
crop_size = 50 # 解析する範囲の大きさ
center_x, center_y = w // 2, h // 2
crop = image_rgb[center_y - crop_size:center_y + crop_size, center_x - crop_size:center_x + crop_size]
# RGBの平均値を計算
r_mean = np.mean(crop[:, :, 0])
g_mean = np.mean(crop[:, :, 1])
b_mean = np.mean(crop[:, :, 2])
# 結果を表示
print(f"平均RGB値: R={r_mean:.2f}, G={g_mean:.2f}, B={b_mean:.2f}")
# 判別ルール(仮の基準)
if b_mean > r_mean and b_mean > g_mean:
result = "伊勢塩飴(青みが強い)"
else:
result = "酒粕飴(黄みが強い)"
print(f"判別結果: {result}")
# 画像とRGB値を可視化
plt.figure(figsize=(6, 3))
plt.subplot(1, 2, 1)
plt.imshow(image_rgb)
plt.title("入力画像")
plt.subplot(1, 2, 2)
plt.bar(["R", "G", "B"], [r_mean, g_mean, b_mean], color=["red", "green", "blue"])
plt.title("RGB 平均値")
plt.ylim(0, 255)
plt.show()
画像を読み込む(cv2.imread())
RGB形式に変換(OpenCVはBGR形式なので変換が必要)
画像の中央部分を切り取り、RGBの平均値を算出
青みが強いなら伊勢塩飴、黄みが強いなら酒粕飴と判定
判定結果を表示し、RGBの成分をグラフで可視化
実行すると、飴の画像とRGBのグラフが表示され、どちらの飴かが判別されます。
このコードを実行すれば、Pythonで飴の色を解析し、どちらの飴か識別できるようになるはずです!
5. 検証結果
伊勢塩飴と酒粕飴それぞれ60個ずつで検証してみます。
1箱60g、1粒およそ5gなので個体差もありますが1箱には平均12粒入っているので5箱ずつ用意しました。

正解率は約92.5%と、業務用には不安があるものの、かなり高い精度で判別できたので目視判断のサポートとしては使えるかもしれません。
酒粕飴の方が判定ミスが多かったのはおそらく光の反射や背景の影響と考えられるため、光の当たり方や撮影環境を統一すると、より正確な判定ができるかもしれません。
6. もっと精度を上げるには?
今回の検証では 約92.5%の正解率という結果になりましたが、より精度を向上させるためには、まだ課題が残っています。
以下に改善点をまとめてみました。
1. 光の当たり方や撮影環境の統一
問題点:光の角度や明るさによって、飴の色が変わってしまう可能性がある。
解決策:
・同じ明るさ・角度で撮影(ライトボックスの利用)
・背景を白やグレーに統一(周囲の色の影響を減らす)
・カメラのホワイトバランスを固定(自動補正を防ぐ)
2. 複数の特徴を組み合わせる
現在の判定はRGB値の違いに基づいていますが、以下のような追加の特徴を考慮すると、より正確に識別できるかもしれません。
・HSV(色相・彩度・明度)の解析
・テクスチャ解析(表面のツヤ感の違いを数値化)
3. 機械学習を導入する
問題点:現在の方法は 閾値(しきい値)によるルールベースの判定 なので、境界付近の色の飴が誤判定されやすい。
解決策:
・画像データを集めて機械学習モデルを構築
・SVMやニューラルネットワークを使い、より高度な識別
・深層学習(CNN)を活用し、色・質感・形状の総合判定を行う
4. AIを活用したリアルタイム識別アプリの開発
Pythonで動作するリアルタイム識別アプリを作れば、もっと手軽に飴の種類を判別できるようになります!
・カメラで飴を撮影 → AIが瞬時に判別!
・スマホアプリ化すれば、どこでも簡単に判別できる
・データを増やしながら学習し、精度をどんどん向上
今後は機械学習を導入し、より高度な識別が可能なシステムを目指してみたいですね!
7. まとめ

Pythonで飴の色を判別できるか試してみたけど、結構うまくいったね!


うん! RGBの色の違いを分析して、92.5%の正解率だったね。


伊勢塩飴は透明感があって青みがかった白、酒粕飴はミルキーで黄みがかった白…
こういう微妙な違いが数値化できるのは面白いね!


でも、まだちょっと誤判定があるから、もっと精度を上げたいよね。


そうだね。例えば…
・撮影環境を統一(光の当たり方や背景を揃える)
・HSVやテクスチャ解析も活用
・機械学習でより高度な分類をする
・リアルタイム識別アプリを作る!
みたいにね。


機械学習を取り入れたら、さらに精度が上がりそう!


うん! でも、まだ混じってるとダメだから…とりあえずこれは一緒に食べちゃおうか!


わーい!
