speckle_quality — PIV solid op

데이터 종류: image2dtable

호출: 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 に落ちる半径 `` を線形

内挿で求め、`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` の換算そのものがずれる。

• 低周波のむら(照明勾配)があると自己相関の裾が持ち上がり過大に出る。

先に高域通過を掛けること。

• 自己相関は循環相関(FFT)なので、周期性のある背景があると乱れる。

• 環の代表半径は環内の半径の平均を使う。ビン番号を使うと半径 1 の環に

対角の √2 が混ざり、1σ=0.6 px で径が 0.80 倍(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

• 2 次元でない / 8x8 未満 / NaN・Inf を含む。

• 画像が完全に一様(`max == min`)—— 斑点が 1 つも無い。

• 自己相関が 0.5 を切らない(視野より斑点が大きい)—— このときだけ

`mean_blob_diameter_pxnan`。他の 3 つは返す。

자세한 사용 가이드

piv_displacement 패밀리 가이드

참고(샘플 데이터·문헌)

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.

• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.

• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.

실행 가능한 예제(이 연산자를 실제로 호출하는 검증된 샘플)

• (아직 없음)

타입이 이어지는 다음 연산자(table 를 입력으로 받는 것)

같은 카테고리(solid)

strain_from_displacement · correlation_quality


*Provenance: dic.py — PIV 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.