strain_from_displacement — PIV solid op

• 데이터 종류: image2d × image2d → image2d

• 호출: import fullseye as fs; fs.ledger.strain_from_displacement(u: 'Any', v: 'Any', window: 'int', method: 'str', spacing: 'float' = 1.0) -> 'tuple[np.ndarray, np.ndarray, np.ndarray]'(구현을 직접 호출하려면 import dic; dic.strain_from_displacement(u: 'Any', v: 'Any', window: 'int', method: 'str', spacing: 'float' = 1.0) -> 'tuple[np.ndarray, np.ndarray, np.ndarray]', 원장에서 가져오려면 opspiv.get("strain_from_displacement"))

• 원장 경유의 반환값: fullseye.ledger.strain_from_displacement(...) 는 선언된 out 형 image2d 의 값만 반환합니다(실제 함수는 보조 정보도 반환). 버려진 쪽이 필요하면 fullseye.ledger.strain_from_displacement.raw(...) 를 쓰거나 dic.strain_from_displacement 를 직접 호출하세요.

사용법

변위장으로부터 변형률장을 구한다. (exx, eyy, exy)를 반환한다.

인수(window와 method에는 기본값이 없다. 이유는 아래)

u x 방향(열)의 변위장 [px]. 2차원.

v y 방향(행)의 변위장 [px]. u와 같은 형태.

window 국소 최소제곱 창의 한 변. 단위는 격자의 절점 수(화소가 아니다).

홀수.

method "infinitesimal" 또는 "green". 그 밖에는 예외.

spacing 절점의 간격 [px]. 전 화소의 조밀한 장이라면 1.0(기본값).

piv_cross_correlate의 격자라면 info["step"].

★ pivops에서 넘길 때 —— 성분의 순서를 틀리면 조용히 망가진다 flow2d는 (dy, dx) 순서. 올바르게는::

flow, info = piv_cross_correlate(a, b, window=32, overlap=0.75)

exx, eyy, exy = strain_from_displacement(

flow[1], flow[0], 9, "green", spacing=info["step"])

flow[0]을 u에 넘기면 x와 y가 뒤바뀌어, 예외 없이그럴듯한 다른 답이 반환된다. 3차원 배열을 그대로 넘긴 경우만은고치는 법을 붙여 거부할 수 있으므로, 그것은 검사해 두었다.

정의 ux = ∂u/∂x 등을 window x window의 평면 피팅으로 구하고,

• "infinitesimal"(미소 변형률, 공학 변형률) exx = ux, eyy = vy, exy = ½(uy + vx)

• "green"(Green-Lagrange) exx = ux + ½(ux² + vx²), eyy = vy + ½(uy² + vy²), exy = ½(uy + vx + ux·uy + vx·vy)

★★ 왜 method에 기본값을 두지 않는가 —— 강체 회전이 만드는 거짓시험편이 θ만큼 돌았을 뿐이고, 재료는 1 미크론도 늘어나지 않았다고 하자. 참 변형률은 0. 엄밀한 강체 회전의 변위장 u = (cosθ-1)x - sinθ·y, v = sinθ·x + (cosθ-1)y를 이미지를 거치지 않고직접 넣은 실측(단위 µε = 1e-6):

θ [도] cosθ-1 infinitesimal piv_velocity_gradient green

0.5 -38.1 -38.1 -38.1 5.3e-14

1.0 -152.3 -152.3 -152.3 9.3e-14

2.0 -609.2 -609.2 -609.2 2.0e-13

5.0 -3805.3 -3805.3 -3805.3 6.5e-13

2도에서 -609 µε. 강철의 항복 변형률(약 2000 µε)의 3할. Green-Lagrange 는 exx = (cosθ-1) + ½((cosθ-1)² + sin²θ) = 0이 대수적으로 엄밀하므로 1e-13로 떨어진다. 기존의 piv_velocity_gradient는 미소 변형률과 같은 값을반환하고(= 같은 거짓을 가진다), piv_strain_rate는 2도에서 +1218 µε (2|cosθ-1|)를 반환한다 —— 유체의 선형화한 회전 u=-ωy, v=ωx라면 0이되는 양이지만, 유한 회전에서는 0이 되지 않는다.

반대로, 재료 시험의 보고서·규격·변형률 게이지와의 대조에서는미소 변형률이 표준이며, Green-Lagrange를 조용히 반환하면 숫자가 맞지 않는다. 어느 쪽이 옳은지는 상황에 따라 뒤집힌다. 그래서 고르게 한다.

★ 다만 "green으로 하면 안전"한 것은 아니다 —— 추정의 오차는 그대로 통과한다 Green의 보정항 ½(ux²+vx²)은 추정한 기울기로부터 만들므로, 기울기의추정이 나쁘면 보정도 나쁘다. 실측(해석 스페클 256², 강체 회전, MARGIN 40 안쪽의 평균 ± 흩어짐, 단위 µε):

θ [도] cosθ-1 | piv+LS w=9 미소 green | lk+LS w=31 미소 green

2.0 -609.2 | -42.9 ± 428 564.7 ± 429 | -698.8 ± 2122 -84.4 ± 2132

5.0 -3805.3 | 364.9 ± 9532 3843.4 ± 9638 | -1372.9 ±22909 2759.6 ±25685

lk의 2도는 교과서대로(-699 ≒ -609의 거짓 → green으로 -84로 줄어든다). 하지만 piv의 2도는 미소 변형률조차 -42.9밖에 반환하지 않는다 —— 회전하는서브셋이 상관을 무디게 하여 기울기의 추정 자체가 ±500 µε 흔들리고 있기 때문이며, 거기에 +609 µε의 Green 보정을 더하면 오히려 +565 µε가 된다. 5도 이상에서는 어느 추정기도 흩어짐이 1e4 µε를 넘어, 평균에 의미가 없다. 정의의 논의가 효과가 있는 것은, 먼저 기울기가 그 정밀도로 측정되고 있을 때뿐.

★ window는 공간 분해능 그 자체같은 piv 변위장에서 균일 변형률을 되읽은 실측(µε):

참값 piv_velocity_gradient w=3 w=5 w=9

100 100.4 ± 21.8 100.4 ± 16.0 100.3 ± 6.4 100.3 ± 1.7

500 501.8 ± 107.2 502.0 ± 78.9 501.4 ± 31.3 501.2 ± 8.6

2000 1996.3 ± 342.0 1996.6 ± 259.5 1994.8 ± 99.3 1995.6 ± 25.9

20000 19768.8 ± 2909.9 19768.9 ± 2210.5 19742.7 ± 790.9 19754.1 ± 209.6

평균은 전부 같다. 흩어짐만이 w와 함께 13.9분의 1까지 줄어든다. 그 대신 w=9는 9 절점(step=8이라면 72 px)을 평평하다고 간주하므로, 노치 끝 같은 곡률이 있는 변형률장에서는 첨두를 과소하게 읽는다. 대칭 창의 최소제곱은 1차 변형률장이라면 엄밀히 반환하지만, 휜 장은 무뎌진다. 기본값을 두면, 고른 기억이 없는 트레이드오프 위에서 숫자가 나온다.

★ NaN의 취급 —— 0으로 메우지 않는다 u나 v에 NaN이 있으면, 그 점을 포함하는 window x window의피팅은 정의할 수 없다. NaN을 포함하는 창의 출력을 모두 NaN으로 한다(u/v 양쪽의 결측을 합친 1개의 마스크를 3성분에 적용). NaN을 0으로 간주하면, 측정할 수 없었던 점이 "변위 0의 점"으로서 피팅에작용하여, 주위에 진짜처럼 보이는 가짜 변형률 기울기를 만든다.

fail-closed

• u / v가 2차원이 아님, 형태가 다름, 4x4 미만.

• u에 (2, h, w)의 flow2d를 통째로 넘겼다(고치는 법을 붙여 거부).

• window가 짝수·3 미만·장보다 큼.

• spacing이 양수가 아님·비유한.

• method가 "infinitesimal" / "green" 이외.

• window와 method를 생략한 호출은 TypeError (기본값을 두지 않았으므로 Python의 인수 기구에서 그대로 떨어진다).

자세한 사용 가이드

• piv_displacement 패밀리 가이드

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

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

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

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

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

• poc_dic_strain — py -3.11 examples/poc_dic_strain.py

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

piv_cross_correlate · piv_multipass · piv_deform_pass · correlation_quality · speckle_quality

같은 카테고리(solid)

correlation_quality · speckle_quality


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

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