File size: 1,432 Bytes
a092bff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
"""TerraMind tensor handoff — ``RGB`` / ``S2L2A`` NPZ (``numpy`` only, no torch)."""

from __future__ import annotations

import io

import numpy as np
from PIL import Image


def rgb_mapbox_npz_from_png(
    png_bytes: bytes,
    *,
    tim_height: int = 224,
    tim_width: int = 224,
) -> bytes:
    """
    Build NPZ with key ``RGB``: shape ``[1, 3, H, W]``, ``float32``, channel order **B, G, R**
    with values ``0..255`` (plan §4.2 branch B).
    """
    im = Image.open(io.BytesIO(png_bytes)).convert("RGB")
    im = im.resize((tim_width, tim_height), Image.Resampling.BILINEAR)
    arr = np.asarray(im, dtype=np.float32)  # H, W, RGB
    bgr = arr[:, :, ::-1]  # H, W, BGR
    chw = np.transpose(bgr, (2, 0, 1))  # 3, H, W
    stacked = np.expand_dims(chw, axis=0)  # 1, 3, H, W
    bio = io.BytesIO()
    np.savez_compressed(bio, RGB=stacked)
    return bio.getvalue()


def s2l2a_npz_from_stack(stack_12_hw: np.ndarray) -> bytes:
    """
    NPZ key ``S2L2A``: shape ``[1, 12, H, W]``, ``float32`` (TerraMind / ``terramind_tim_local`` order).
    ``stack_12_hw`` must be ``(12, H, W)``.
    """
    if stack_12_hw.ndim != 3 or stack_12_hw.shape[0] != 12:
        raise ValueError(f"expected (12, H, W), got {stack_12_hw.shape}")
    chw = stack_12_hw.astype(np.float32, copy=False)
    stacked = np.expand_dims(chw, axis=0)
    bio = io.BytesIO()
    np.savez_compressed(bio, S2L2A=stacked)
    return bio.getvalue()