solid opimage2d → tableimport fullseye as fs; fs.ledger.speckle_quality(img: 'Any') -> 'dict[str, float]' (実装を直接呼ぶなら import dic; dic.speckle_quality(img: 'Any') -> 'dict[str, float]'、台帳から引くなら opspiv.get("speckle_quality"))撮ったスペックルが DIC に向いているかを 4 つの数字で返す。
pivops にも fullseye にも無い(speckle_filter は SAR の斑点雑音
除去で別物)。撮影の場で「この模様で測れるか」を判定するための口。
引数
img スペックル画像(2 次元)。輝度の規格は問わないが、coverage は
画像内の最小・最大を基準にした相対しきい値で数える。
戻り値は dict:
mig 平均輝度勾配 sqrt(mean(Ix² + Iy²))。
Pan らの DIC 品質指標。変位の分散の下限が
σ_noise / (mig √N) で決まるので、これが
小さいと何をしても測れない。
grad_rms x 方向だけの sqrt(mean(Ix²))。
coverage 0.2*(max-min) + min を超える画素の割合。
mean_blob_diameter_px 斑点の平均直径 [px] の推定値(下記)。
★ mean_blob_diameter_px は推定であって測定ではない
平均を引いた画像の自己相関の動径平均が 0.5 に落ちる半径 R½ を線形
内挿で求め、diameter = √2 · R½ を返す。√2 の根拠: 1σ 半径 r の
ガウス斑点をランダムに撒いた場の自己相関は 1σ が r√2 のガウスなので
R½ = 2r√(ln2)、斑点の FWHM は 2r√(2ln2)、比がちょうど √2。
つまり斑点がガウスで位置が無相関という仮定の上でだけ FWHM に一致する。
実測(左: 解析スペックル、1σ 半径を振り被覆率が揃うよう個数を調整。
右: piv_synth_particles、diameter_px は 2σ なので FWHM は
1.1774 × diameter_px):
1σ r FWHM 推定 比 | d_px FWHM 推定 比 cov mig
0.6 1.41 1.36 0.97 | 1.5 1.77 1.80 1.02 0.043 0.1351
1.0 2.35 2.39 1.01 | 2.5 2.94 2.93 1.00 0.106 0.1676
1.6 3.77 3.77 1.00 | 4.0 4.71 4.69 1.00 0.159 0.1775
2.5 5.89 5.77 0.98 | 6.0 7.06 7.01 0.99 0.286 0.1764
4.0 9.42 9.18 0.97 |
ガウス斑点なら 3 % 以内。実物のスペックル(印刷・スプレー)は ガウスではないので、この表は換算の算数が合っていることの確認であって、 実写での精度ではない。何に偏るか:
√2 の換算そのものがずれる。★ MIG は下限を切る指標であって、最大化する目的関数ではない
上の左表で mig は斑点が細かいほど大きい(1σ=4.0 の 0.0384 に対し
1σ=0.6 で 0.1127、2.9 倍)。だが直径 1.4 px のスペックルは標本化が
足りず、examples/poc_dic_strain.py の 9 節の実測では偏りも散らばりも
最悪になる。MIG を最大化すると測れないスペックルを選ぶ。
右表の粒子像では d=4.0 で頭打ちになり d=6.0 でわずかに下がる ——
同じ指標が入力の作り方で単調にも非単調にもなるので、
絶対値ではなく同じ撮り方どうしの比較に使うこと。
★ coverage のしきい値は Otsu ではない
0.2*(max-min) + min の固定しきい値。Otsu は 2 峰の分布を仮定するが、
スペックルの輝度分布は斑点の重なりで単峰になることが多く、Otsu だと
しきい値が画像ごとに動いて比較できなくなる。固定なら少なくとも
同じ規格の画像どうしは比べられる。
★ MIG は単位を持つ 「輝度 / px」。8 bit 整数のまま渡すか [0, 1] に規格化してから渡すかで 255 倍違う。同じ規格の画像どうしでしか比べられない。
fail-closed
max == min)—— 斑点が 1 つも無い。mean_blob_diameter_px が nan。他の 3 つは返す。py -3.11 examples/piv_field_analysis_tour.pytable を入力に取れる)—
solid)strain_from_displacement · correlation_quality
Provenance: dic.py — PIV operator registry. この per-op ノートは tools/opdocs.py md が自動生成(手編集しない)。
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.