fullseye

小さな点状の目標を見つけて、副画素で位置を出す

できること

頑健に推定した背景と雑音から 背景 + kσ を超える局所最大を拾い、重心で副画素の位置を返します。名前は天体ですが中身は分野中立で、漂流物・微小欠陥・蛍光輝点・粒子に同じものが使えます。

What it does

Pick local maxima above a robustly estimated background plus k sigma, and return sub-pixel centroids. The name is astronomical but the method is domain-neutral: drifting objects, small defects, fluorescent puncta, particles.

向くところ / 向かないところ

向く: 目標が点広がり関数と同じ大きさのとき。密度が低く、重なりが少ないとき。

向かない: 目標が広がっている場合(領域として測る blob_label 系へ)。★検出率だけを見ると誤検出が見えません —— 空撮では誤検出は画面の端でなく直下に集中します(poc_search_sweep_width で 0-32 m 帯 113 件 / 最外帯 0 件)。閾値だけで走査幅は 406 m から 170 m まで動くので、検出性能は誤検出率と対でしか語れません。

最初の 1 本

import fullseye as fs
import numpy as np

img = np.random.default_rng(0).normal(0.0, 0.01, (128, 128))
img[40, 70] += 1.0                              # 点目標を 1 つ植える
pts = fs.star_detect(img, threshold_sigma=5.0)
print(pts)                                      # (row, col) の副画素座標

推奨パイプライン

noise_sigma → star_detect → find_peaks → peak_subbin

noise_sigma で頑健な雑音を測り → star_detect で 背景 + kσ を超える局所最大を副画素重心で → 1-D なら find_peaks → peak_subbin で頂点を副ビンに。

代替

skimage の局所最大なら xsk3_peak_local_max。広がった目標は blob_seeds / blob_label。

限界

目標が広がっていると不適(blob_label へ)。検出率だけでは誤検出が見えない —— 空撮の誤検出は直下に集中し、閾値で走査幅が 406 → 170 m 動く(poc_search_sweep_width)。

実寸校正

位置は px。実距離は mm_per_px_from_reference(空撮なら高度から GSD)で換算し、高度が変われば取り直す。

裏づけ