synth_starfield — ASTROSTACK synth op

• 데이터 종류: 없음 → image2d(인자만으로 정해지는 연산자 —— 이미지나 데이터 입력을 받지 않습니다)

• 호출: import fullseye as fs; fs.ledger.synth_starfield(shape=(128, 128), n_stars=30, flux_min=400.0, flux_max=9000.0, fwhm_px=3.2, psf='gaussian', moffat_beta=2.5, sky=60.0, read_sigma=6.0, shift_row=0.0, shift_col=0.0, n_cosmic=0, cosmic_flux=4000.0, margin_px=6.0, seed=0, field_seed=None, noise=True)(구현을 직접 호출하려면 import astrostack; astrostack.synth_starfield(shape=(128, 128), n_stars=30, flux_min=400.0, flux_max=9000.0, fwhm_px=3.2, psf='gaussian', moffat_beta=2.5, sky=60.0, read_sigma=6.0, shift_row=0.0, shift_col=0.0, n_cosmic=0, cosmic_flux=4000.0, margin_px=6.0, seed=0, field_seed=None, noise=True), 원장에서 가져오려면 opsastrostack.get("synth_starfield"))

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

• 실제 반환: (frame, truth) -> image2d

사용법

알려진 성야를 한 장 합성합니다 —— 이 족의 정답 공급원.

별은 flux_min〜flux_max의 로그 균일 분포에서 총 플럭스(전자)를 뽑고, 화상의 가장자리에서 margin_px 이상 안쪽에 균일하게 둔다. *psf*가 "gaussian"일

때는 scipy.special.erf에 의한 화소의 엄밀한 적분이므로, 별 1개의총합은 준 플럭스와 (화상 밖으로 나간 몫을 제외하고) 엄밀하게 일치한다. "moffat"은 Moffat, *A Theoretical Investigation of Focal Stellar Images*, A&A 3, 455 (1969)의 (1 + (r/alpha)^2)^(-beta)로, 지상의 대기가 지배하는별 상의 표준 모델이다(회절 한계 쪽 형제는 optics.airy_pattern).

노이즈는 1가지 이론만 갖는다 —— Poisson(별 + sky)(photoncount.photon_sample를 photons_per_unit=1.0로 호출)에 그 후에 우주선을 더하고, 마지막에 가법 가우스 읽기 노이즈 read_sigma를 더한다. 순서는 물리 그대로이며, 우주선은 광자가 아니다(Poisson 표본화를 거치지 않는다). 우주선의 위치는 defectgen.defect_pits의 균일 점과정에 맡긴다 —— "드물고 작고 날카로운, 위치가 무작위인 부착"은 공식 부식과 같은 확률 기하이며, 두 번째 모델을쓸 이유가 없다.

*shift_row* / *shift_col*은 별 필드 전체를 서브픽셀로 움직인다(디더). 합성한참값의 좌표도 그만큼 움직이므로, 위치 맞춤과 drizzle의 검산에 쓸 수 있다.

Returns (frame, truth):

• frame —— (H, W) float64, 단위는 전자.

• truth —— dict. rows / cols (N,)은 별의 참 중심(정수 좌표가화소 중심인 규약), fluxes (N,)은 참 총 플럭스, fwhm_px / sigma_px / alpha_px / beta는 PSF, sky / read_sigma는잡음, cosmic_mask (H, W) bool은 우주선의 화소, noiseless (H, W)는 노이즈를 싣기 전의 기댓값(검산용).

seed는 2개 있다. field_seed가 별 필드(좌표와 플럭스)를, seed가 그 회차의 관측(샷 노이즈·읽기 노이즈·우주선의 위치)을정한다. field_seed=None이면 seed와 같은 값이 된다. 나누어 둔 이유는실측에서 발견한 사고로, 1개로 했던 최초 판에서는 synth_frame_series가 프레임마다 seed를 바꾼 결과 별 필드 자체가 매 프레임 다른 것이 되어, 위치 맞춤이 1대응밖에 찾지 못하고(frame_align이 올바르게 fail-closed(실패 시 거부)했다), 프레임 간의 우주선 제거는 "모든 화소가 이상값"을 반환했다. 같은 하늘을 다시 찍는 것과 다른 하늘을 찍는 것은인수 1개로 혼동될 수 있다 —— 그래서 형이 아니라 이름으로 나눈다. 난수는 둘 다 numpy.random.default_rng이므로, 같은 seed 쌍이라면어느 기계에서도 같은 프레임.

Ground truth it reproduces(tests/test_astrostack.py로 고정):

noise=False, sky=0, fwhm_px=3.0인 1별 프레임(64x64, 플럭스 5000 e-)에서는 화상 전체의 총합과 준 플럭스의 상대 오차가 1.8e-16 —— float64 반올림 1회분이며, "거의 보존"이 아니라 보존이다. 반경 r의 원형 개구가 줍는 비율은 1 - exp(-r^2/(2 sigma^2))이며, r = 2 sigma이면 0.8647, r = 3 sigma이면 0.98889.

Raises ValueError: *shape*가 너무 작다 / *n_stars*가 음이 아닌 정수가 아니다 / flux_min > flux_max / *psf*가 PSF_MODELS에 없다 / moffat_beta <= 1(적분이 발산한다) / margin_px가 화상보다 크다 / *seed*가 음이 아닌 정수가 아닌 경우.

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

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

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

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

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

• astro_stacking — py -3.11 examples/astro_stacking.py

• poc_astro_photometry — py -3.11 examples/poc_astro_photometry.py

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

frame_quality · noise_sigma · cosmic_ray_reject · star_detect · psf_fit · aperture_photometry · frame_align

같은 카테고리(synth)

synth_frame_series


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

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