speckle_quality — PIV solid op

• 데이터 종류: image2d → table

• 호출: import 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의 환산 자체가 어긋난다.

• 저주파의 얼룩(조명 기울기)이 있으면 자기상관의 자락이 들려 과대하게 나온다. 먼저 고역 통과를 걸 것.

• 자기상관은 순환 상관(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_px가 nan. 나머지 3개는 반환한다.

자세한 사용 가이드

• piv_displacement 패밀리 가이드

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

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

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

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

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

• piv_field_analysis_tour — py -3.11 examples/piv_field_analysis_tour.py

타입이 이어지는 다음 연산자(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.