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개는 반환한다.
• 샘플 데이터 카탈로그(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.