← 種カウントアプリに戻る · 使い方

播種均一性スコア 解説書

種カウントシステム — 均一性指標 v3(校正済スケール+寄り減点)/2026-09-24 版

1. このスコアは何を測るか

トレーに播いた種が「どれだけムラなく配置されているか」を0〜100の1つの数値で表します。 撮影した写真から検出された全粒の座標だけを使って計算するため、粒数のカウントと同時に自動で求められます。
種カウントアプリでは、撮影するとすぐに「検出粒数」の隣に均一性スコアとして表示され、保存・書き出しデータにも記録されます。

読み方(これだけ覚えれば OK)
  0点 …… 全部が一か所に固まっている(完全な凝集)
  50点 …… 何も考えずにバラ撒いたのと同じ(ランダム散布相当)
  100点 …… 物理的に可能な最良の等間隔配置(ハチの巣状の六方格子)
  寄り …… 種が片側・隅に寄っていると、その分を減点(アプリでは「右下に寄り 12%(−16点)」と表示)

2. スコアの構成 — 2つの「均一性」+寄り減点

「均一」には実は2つの意味があり、片方だけでは不十分です。本スコアは両方を測って合成します。

S_local(間隔の規則性)S_cover(面のカバー)
何を見る粒どうしの間隔が揃っているか
(ダブり・団子の検出)
トレー全面に行き渡っているか
(空きパッチ・偏りの検出)
計算法Clark–Evans 最近接距離指数 R
(各粒から最も近い粒までの距離の平均を、同密度ランダム配置の期待値と比較。境界補正つき)
推定領域を8×8マスに区切り、マスごとの粒数のバラつき(変動係数)を測定
高得点の条件どの粒も等間隔(R→2.149)どのマスもほぼ同じ粒数

合成は幾何平均です:

raw = 100 × √( S_local × S_cover )

幾何平均にする理由:どちらか一方でも悪ければ総合点が大きく下がる性質があるためです。 「面は埋まっているが団子だらけ」「等間隔だが半面が空き」のどちらも高得点にはなれません。

配置の例S_localS_cover総合
全面に等間隔(理想)
半面だけに等間隔
全面にあるが団子だらけ
ランダム散布中(=50点)

2-2. 寄り減点(v3 で追加)

上の2つだけでは、トレー全体が片側や隅に寄っている状態をほとんど捉えられませんでした。 面のカバーは8×8の細かいマス(1マス約8粒)で数えるため、全体の寄りが粒数の自然なゆらぎに埋もれてしまうからです (例:右下に大きく寄った千葉 0426_093050 が 67.4点、均一な千葉 0204_085249 が 68.2点)。 そこで、全体の寄りを別に測って減点します。

寄り%  = 推定範囲の中心から全粒の重心までのずれ(範囲の半幅に対する%)
許容値 = 偶然でも起こる寄りの平均 × 2(約500粒で 6.5%。粒数が少ないほど大きい)
減点   = 3点 × (寄り% − 許容値)      ※寄り%が許容値以下なら減点なし
スコア = (間隔 × 面カバーの校正スコア) − 減点      ※0未満にはしない
寄り減点の効果

上段は寄りが大きい4枚(10〜22点の減点)、下段は寄りが小さい4枚(減点なし)。

3. 撮影のズレに強くする工夫(2つの正規化)

3-1. トレー境界の自動推定

現場写真ではトレーの外側(縁や机)が写り込みます。画像全体を基準にすると、写り込みが多い写真ほど 「外周が空いている」と誤判定され、スコアが不当に下がります。そこで粒の座標そのものからトレー内側の領域を自動推定します (粒点群の最小外接回転矩形 + 粒半径ぶんの余白)。アプリでも推論後の写真に、この範囲が赤い点線で表示されます。実写真での推定例(赤枠):

境界推定の例

この補正の導入前は、写り込みの多い北海道の写真が千葉より約10点低く出ていました(測定バイアス)。 導入後は両産地がほぼ同じ帯域になり、公平な比較が可能になりました。

3-2. 粒数によらない面ムラ評価(ポアソン正規化)

粒数が少ないほど、ランダムでもマスごとの粒数はバラつきます。生の変動係数を「同じ粒数のランダム散布で期待されるバラつき」で 割ることで、100粒のトレーと500粒のトレーを同じ物差しで比較できるようにしています。

4. 0〜100への校正 — なぜそのままの値を使わないか

rawスコアには技術的な上限があります。400粒を完璧な六方格子に並べたシミュレーションでも、 8×8マス集計の離散化誤差(マス境界と格子周期のズレ)により raw は79.1点までしか届きません。

理想配置シミュレーション

そこで、シミュレーションで実測した2つのアンカー(ランダム散布 raw=46.8、六方格子 raw=79.1)を使い、 表示用スコアを二段階の線形変換で校正します:

score = 50 × raw ÷ 46.8                       (raw ≤ 46.8 のとき: 0〜50)
score = 50 + 50 × (raw − 46.8) ÷ (79.1 − 46.8) (raw > 46.8 のとき: 50〜100)

これにより 0=完全凝集 / 50=ランダム / 100=物理的理想 という直感的な目盛りになり、マイナス値も発生しません。 参考として正方格子(20×20)は約90点に写像されます。

5. 実データでの分布(千葉31枚+北海道38枚)

均一性スコア v3 の分布
産地平均範囲寄り減点あり
千葉(31枚)69.151.4 〜 77.37枚
北海道(38枚)66.436.6 〜 74.510枚

寄り減点のないトレー(52枚)はすべて 64点以上で、ランダムよりはっきり均一です。寄りが目立つ17枚は減点され、特に寄りの大きいものは50点前後以下に下がります(最低 36.6点)。
点線は寄り減点前(v2)の分布で、v2 ではほぼ全てのトレーが 59〜77点の狭い範囲に収まり、寄りの有無を見分けられませんでした。

判定の目安(暫定)

スコア評価状態の目安
75〜◎ 非常に良い実データ上位。目視でもムラを感じない
65〜75○ 良い標準的な仕上がり
55〜65△ ややムラ空きパッチ・粒だまり・軽い寄りが目につく
〜55✕ 要改善寄りやかたまりが目立つ。矢印の反対側へ広げる等、播き方の見直しを

※ 閾値は現時点の69枚に基づく暫定値。運用データが増えたら見直してください。

6. 制約・注意事項

7. 計算方法

現場(種カウントアプリ)

操作は不要です。撮影・画像選択のたびに端末内で自動計算されます(オフライン可)。結果は記録一覧の「均一性」列、summary.csvuniformityyori_pctyori_dir 列、measurements.jsonuniformity 項目(score / base / yori / yoriDir / penalty / raw / R / cvRel / sLocal / sCover)に入ります。

開発PC(まとめて再計算する場合)

conda activate seedcount
python uniformity_score.py --json_dirs photos/raw photos/hokkaido2 --out output_uniformity

入力はAnyLabeling形式の点JSON(label=seed)。出力は uniformity_v3.csv (画像ごとの n / R / CV_rel / S_local / S_cover / raw / score_v2 / yori / yori_dir / yori_tol / penalty / score)。 実装は uniformity_score.py(約170行、依存は numpy / scipy / opencv のみ)。 アプリ側の実装 uniformity.js は同じ定義・同じアンカーで、Python版と一致することを確認済みです(69枚で差0.3点未満)。


種カウントシステム 均一性指標 v3 / v2定義 2026-08-10・寄り減点追加 2026-09-24 / アンカー: RAW_RANDOM=46.8, RAW_IDEAL=79.1(400粒シミュレーション実測)/ 寄り減点: 3点/1%、許容値=偶然の寄りの平均×2