drizzle_resample — ASTROSTACK stack op

• 데이터 종류: images → image2d

• 호출: import fullseye as fs; fs.ledger.drizzle_resample(frames, shifts=None, scale=2.0, pixfrac=1.0)(구현을 직접 호출하려면 import astrostack; astrostack.drizzle_resample(frames, shifts=None, scale=2.0, pixfrac=1.0), 원장에서 가져오려면 opsastrostack.get("drizzle_resample"))

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

• 실제 반환: (sci, wht) -> image2d

사용법

Drizzle —— 부화소만큼 어긋난 여러 프레임으로 더 촘촘한 격자를 만듭니다(면적 보존).

Fruchter & Hook, *Drizzle: A Method for the Linear Reconstruction of Undersampled Images*, PASP 114, 144 (2002). 입력 화소를 한 둘레 줄인 "방울(drop, 한 변 pixfrac)"로 보고, 출력 격자의 화소와의 겹침 면적 에 비례하여 플럭스를 뿌린다. 보간하지 않으므로,

• 총 플럭스가 보존된다. 방울이 출력 격자 안쪽에 들어가 있는 한 sci.sum()은 입력 프레임 총합의 평균과 엄밀히 일치한다(실측: shifts=0, scale=2, pixfrac=0.7에서 상대 오차 0.0). 이것이 반환값만으로 검산할 수 있는 형태로 만든 이유이다.

• pixfrac을 작게 할수록 방울이 출력 화소 안쪽에 들어가는 비율이 늘어 해상도는 올라가지만, 덮이지 않는 출력 화소가 생긴다(wht가 그곳에서 작아진다). 이 줄다리기가 drizzle의 유일한 조정점이다.

효과가 있는 것은 샘플링이 부족할 때뿐이라는 것이 실측의 결론이다. 48x48에 10개 별, 디더 1.5 px, 16장으로 측정(값은 입력 화소로 환산한 FWHM)::

참 FWHM 단일 프레임 그대로 평균 drizzle x2 (pixfrac=0.5)

1.0 1.773 2.249 1.312

1.3 1.929 2.876 1.572

1.8 2.262 2.648 3.086

2.5 4.057 4.295 3.586

FWHM이 2 화소를 밑도는(나이퀴스트를 깨는) 곳에서만 drizzle이 이긴다. 디더한 프레임을 그대로 평균하면 상은 오히려 무뎌진다(1.773 → 2.249) —— 어긋남을 평균해 버리기 때문이며, drizzle은 바로 그 어긋남을 해상도로 바꾼다. 1.8 px 이상에서는 이미 충분히 샘플링되어 있으므로 drizzle은 이득이 없고방울의 컨볼루션만큼 손해를 본다.

두 별이 분리되는지로 보면 알기 쉽다. σ=0.55 px의 별 2개를간격을 바꿔 가며 16장 디더 촬영하고, 평균 합성과 drizzle x3 (pixfrac=0.4)로 star_detect한 실측: 간격 1.6 입력 화소에서 평균 합성은 1개, drizzle은 2개를 찾았다(2.0 px 이상에서는 둘 다 2개).

*shifts*는 (N, 2)의 (dr, dc)로, 프레임 i가 기준에서 얼마나어긋나 있는지이다(synth_frame_series의 truth["shifts"]가 이 방향). None이면 모두 0.

★ 부호에 주의 —— frame_align / align_frames가 반환하는 행렬의평행 이동은 "프레임을 기준으로 되돌리는" 방향, 즉 여기서 필요한 (dr, dc)와 부호가 반대이다. 추정값을 그대로 넘기면 어긋남이 상쇄되지 않고 배가 되며, 예외도 없이 이중상이 된다(실측: 6장 96x96에서 est + truth ≈ 0, 그대로 넘기면 잔차가 2배). 행렬에서 올바른 방향의 shifts를 만들려면 drizzle_shifts를 사용할 것. 회전은 받지 않는다 —— 회전이 들어가면 축이 분리되지 않아 겹침 면적을 닫힌 식으로 쓸 수 없게되므로, 먼저 align_frames로 되돌릴 것(거기서 보간 오차를 치른다는거래가 보이는 편이 정직하다).

★ 입력 화소는 출력의 어디로 가는가(이 규약이 쓰여 있지 않았다). 화소 중심끼리의 대응으로::

out = in * scale + (scale - 1) / 2

scale=2이면 입력 (8, 8)의 별은 출력 (16.5, 16.5)에 선다. 입력 화소 in 이 차지하는 구간 [in, in+1)이 출력의 [in*scale, (in+1)*scale)로 옮겨지고, 그 중심이 위 식이 된다 —— 단순한 in*scale이 아니다. 반 화소를 빠뜨리면 scale=4에서 1.5 출력 화소, 입력으로 환산해 0.375 화소의 계통 어긋남이 되어, 위치 맞춤 후의 측광이나 이중성의 간격이 그만큼 조용히 틀어진다.

실측(24x24, 단일 화소 별, pixfrac=1, 무게중심으로 측정): scale이 2 / 3 / 4일 때 위 식과의 차이는 엄밀히 0. scale=2.5에서는 0.05 출력 화소어긋나지만, 이는 식의 오류가 아니라 가장자리 출력 화소가 부분적으로만 덮이기 때문으로, 첨자의 무게중심이 연속량의 무게중심과 어긋나는 몫이다(정수배라면 이 끝수가생기지 않는다). 위치를 엄밀히 다루고 싶을 때는 정수 scale을 사용할 것.

Returns (sci, wht):

• sci —— (round(H*scale), round(W*scale)) float64, 총 플럭스단위(입력과 같은 전자). 격자 밖으로 나간 방울만큼 총합이 줄어들므로, sci.sum()과 입력 총합의 차이는 "가장자리에서 잃은 양" 그 자체이다.

• wht —— 같은 형태의 가중치 맵. 출력 화소가 몇 장 분의 방울로 덮였는지(출력 화소 면적을 1로 한다). pixfrac=1이고 shifts=0이면 내부는엄밀히 1.0.

★ 볼 때 / 잴 때는 sci / wht를 사용할 것. sci는 총 플럭스를보존하기 위해 "뿌려진 양"을 그대로 가지고 있어 피복의 불균일이 상에남아 있다. pixfrac을 작게 하면 피복이 격자 모양으로 얼룩지므로, 날것의 sci에 검출을 걸면 그 격자가 별로 둔갑한다 —— 실측(scale=3, pixfrac=0.4, 이중성 1쌍 24장)에서 star_detect는 날것의 sci 에 대해 200개(상한에 붙음)를 반환했고, sci / wht에 대해서는올바르게 2개를 반환했다. 보존 법칙(sci)과 겉보기(sci / wht)는다른 양이며, 한쪽을 다른 쪽 대신 쓰면 예외 없이 틀린다.

Raises ValueError: *frames*가 list / tuple이 아님 / 형태가 맞지않음 / *scale*이 1 미만 / *pixfrac*이 (0, 1] 밖 / *shifts*의 형태가 (N, 2)가 아님 / 출력이 MAX_OUTPUT_ELEMENTS를 넘는 경우.

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

• 샘플 데이터 카탈로그(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

• poc_superresolution_limits — py -3.11 examples/poc_superresolution_limits.py

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

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

같은 카테고리(stack)

sigma_clip_stack


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

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