deform op• 데이터 종류: points × points → points
• 호출: import fullseye as fs; fs.ledger.register_nonrigid(src, dst, iters=20, lam=1.0, k_smooth=None)(구현을 직접 호출하려면 import deform3d; deform3d.register_nonrigid(src, dst, iters=20, lam=1.0, k_smooth=None), 원장에서 가져오려면 ops3d.get("register_nonrigid"))
• 원장 경유의 반환값: fullseye.ledger.register_nonrigid(...) 는 선언된 out 형 points 의 값만 반환합니다(실제 함수는 보조 정보도 반환). 버려진 쪽이 필요하면 fullseye.ledger.register_nonrigid.raw(...) 를 쓰거나 deform3d.register_nonrigid 를 직접 호출하세요.
• 실제 반환: (warped, info, info)
비강체 ICP 로 src 를 dst 쪽으로 붙입니다.
각 반복에서 "현재 변형된 src"로부터 dst로의 최근접 대응을 다시 설정하고, 그 대응을제어점 대응(제어 중심 = 원래 src)으로 삼아 TPS를 정칙화와 함께 다시 맞추고, src를변형한다. 대응을 알지 못해도 매끄러운 비선형 변형을 복원할 수 있다.
구현상의 요점(강건성):
• 스케일 불변: λ는 dst의 무게중심 주위 RMS 반지름에 대한 상대값으로 다룬다(내부에서 λ_eff = λ·scale). 좌표가 100배여도 같은 λ가 같은 동작을 준다.
• 발산 가드: 대응이 모호하면 단순한 NN 반복은 양의 피드백으로 발산할 수 있다. 반복마다 대응 RMS를 감시하고, 최적 반복(최소 RMS)의 변형과 모델을 반환한다. 이로써 나쁜 λ에서도 "초기보다 나쁜" 결과를 반환하지 않는다.
• λ가 클수록 강체에 가깝다(변형이 작다). 기본값 λ=1.0은 보수적(거의 강체)이므로, 큰 비선형 변형을 복원하고 싶다면 λ를 작게(예: 0.01~0.05) 한다.
인수:
src: (N,3) 이동 측 점군.
dst: (M,3) 고정 측(참조) 점군.
iters: 최대 반복 횟수.
lam: TPS 정칙화 λ(스케일 상대). 클수록 변형이 매끄럽다(잘못된 대응에 강건하고,
맞춤은 느슨함). 작을수록 밀착한다(세밀한 변형을 복원).
k_smooth: None이면 최근접 1점을 목표로 한다(하드 대응). 정수를 주면
dst 측 k 근방의 평균을 목표로 하여 대응을 평활화한다(잡음에 강건).
반환값:
warped_src: (N,3) 최적 반복에서의 변형된 src.
model: 대응하는 TPS 모델(제어 중심 = 원래 src, 원래 좌표계에서 그대로
tps_warp에 넘길 수 있음). 1번도 맞추지 못했다면 None.
info: dict. "rms"(최적 대응 RMS), "rms_init"(초기=항등일 때의 대응 RMS),
"rms_history"(list), "iters"(실제 반복 수), "best_iter", "converged"(bool).
예외:
ValueError: 형상 부정, 점 수 부족, k_smooth 부정.
• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.
• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.
• nonrigid_deform — py -3.11 examples_3d/nonrigid_deform.py
points 를 입력으로 받는 것)points_to_voxel · gaussians_to_voxel · estimate_point_normals · to_points · match_points_ncc · match_pca · moment_axes · icp_point2point_3d
deform)tps_fit · tps_warp · register_cpd_rigid
*Provenance: deform3d.py — 3D 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.