descriptor op• 데이터 종류: pairs → matrix
• 호출: import fullseye as fs; fs.ledger.contour_fourier_complex(points, n_harmonics=None, parametrisation='index')(구현을 직접 호출하려면 import fourierdesc; fourierdesc.contour_fourier_complex(points, n_harmonics=None, parametrisation='index'), 원장에서 가져오려면 opsshape2d.get("contour_fourier_complex"))
닫힌 윤곽을 복소 푸리에 급수의 계수로 만든다 —— z(t) = Σ c_k exp(2πi k t).
인수:
points: (N,2) 의 닫힌 윤곽 꼭짓점. (row, col) 순서(fourierdesc 와 같다).
n_harmonics: 남길 차수 K(|k| <= K). None 이면 표현할 수 있는 상한까지.
parametrisation: "index" = 점의 첨자를 등간격 매개변수로 한다 /
"arclength" = 호 길이로 등간격으로 다시 찍은 뒤 변환한다.
반환값: (2K+1, 3) 의 실수 배열(matrix). 행은 [k, Re c_k, Im c_k] 이고 k 는 0, 1, -1, 2, -2, …(낮은 주파수부터).
★매개변수 잡는 법을 기본값으로 말없이 정하지 않는 것이 이 op 의 핵심. 불균일하게 샘플링된윤곽을 "index" 로 읽으면 점이 조밀한 곳에 여분의 시간이 할당되어, 그림은 비슷한데 계수가 다른 것이 된다(실측에서 k=3 의 계수가 47 배 달랐다). 기본값은 "index"(FFT 의 본래 의미)이지만, 형상의 기술로서 쓴다면 "arclength" 를 고를 것.
★★"arclength" 를 고르면 op 내부에서 윤곽을 다시 찍으므로, 반환되는 계수는넘긴 배열이 아니라 다시 찍은 윤곽을 기술한다. 그러므로 contour_fourier_truncation_energy 의 예언은 "다시 찍은 윤곽에 대해" 엄밀하며, 호출자가 수중의 배열로 오차를 재면 맞지 않는다(실측: 512 점에서 1.15 어긋났다). 수중의 배열에 대해 엄밀한 예언을 원할 때는 먼저 호 길이로 다시 찍은 뒤 "index" 로 호출할 것.
★호 길이 재샘플링은 멱등이 아니다: 표본을 현으로 잇기 때문에, 이미 등호장인 윤곽에 1 번 더 걸면 점이 최대 3.73 px 움직이고(평균 0.84 px), 길이가 다시 3.25 % 줄어든다. 두 번 걸지 말 것.
• shape_description_2d 패밀리 가이드
• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.
• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.
• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.
• poc_one_stroke_epicycles — py -3.11 examples/poc_one_stroke_epicycles.py
matrix 를 입력으로 받는 것)contour_epicycle_chain · contour_fourier_truncation_energy
descriptor)elliptic_fourier · reconstruct · invariants · normalize · descriptor_distance · fourier_smooth · from_xld · contour_epicycle_chain
*Provenance: fourierdesc.py — SHAPE2D 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.