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)(以 photons_per_unit=1.0 呼叫 photoncount.photon_sample)上,之後加上宇宙射線,最後 加上加性高斯讀出雜訊 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 個 seed 的最初版本中,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* 不是非負整數時。
• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 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)*Provenance: astrostack.py — ASTROSTACK 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.