diff --git "a/docs/05_TECH/TECH_01_DNG\345\257\276\345\277\234\350\246\201\346\261\202\344\273\225\346\247\230.md" "b/docs/05_TECH/TECH_01_DNG\345\257\276\345\277\234\350\246\201\346\261\202\344\273\225\346\247\230.md" index 527ad36..ae794c8 100644 --- "a/docs/05_TECH/TECH_01_DNG\345\257\276\345\277\234\350\246\201\346\261\202\344\273\225\346\247\230.md" +++ "b/docs/05_TECH/TECH_01_DNG\345\257\276\345\277\234\350\246\201\346\261\202\344\273\225\346\247\230.md" @@ -20,6 +20,21 @@ これらの実装は **SmTIAS-LightSim 側にコピーされる前提**で,再利用性の高い設計とする. +## 実装状況 (Implementation Status — SmTIAS-Evaluation) + +本書は受領した要求仕様であり,以下は **SmTIAS-Evaluation での実装結果**との対応(要求と異なる点を含む).詳細経緯は [PROGRESS.md](../PROGRESS.md),コピー向け要点は [TECH_02](TECH_02_SmTIAS-LightSimへの引き継ぎ.md). + +| 要求 | 状況 | 実体・備考 | +| --- | --- | --- | +| 1. DNG 読み込み I/F(`dng_loader.py` / `load_image_dng`) | ✅ 実装 | `src/io/dng_loader.py`.`rgb_float32`・`luma_float32`(`output_color=raw`)・`rgb_uint8`(sRGB)を実装 | +| 2. メタデータ JSON 読み込み(`metadata_loader.py`) | 🟡 一部 | 専用モジュールは未作成.LSC マップ読み込みは `src/io/dng_pipeline.py` の `lsc_gain_rgb` に内包.`load_metadata` / `load_hot_pixel_list` は未実装 | +| 3. Hot pixel マスク(`mask_hot_pixels`) | ⬜ 未実装 | SmTIAS 側のホット画素提供待ち | +| 4. LSC 参照(`apply_lsc_inverse`) | ⚠️ 方針転換 | 実機 DNG は LSC **未補正**と判明.逆適用ではなく **順適用**(`dng_pipeline.lsc_gain_rgb` でビネット除去).`apply_lsc_inverse` は未実装 | +| 5. PNG 経路との並列対応 | ✅ 実装 | `load_image` は無修正.DNG は `scripts/run_uniformity_dng.py` で別経路.統一 I/F `load_image_any` は未実装(任意項目) | +| 6. 評価指標との互換 | ✅ 実装 | `uniformity` / `spatial` 等は無修正で DNG 輝度(linear ×255 スケール)に適用 | + +> 仕様外で新規追加: `src/io/dng_pipeline.py`(DNG の LSC 順適用・portrait 化・Rec.709 輝度化をまとめた高レベル I/F)と,動径 min/max 比指標(`spatial.calc_radial_min_max_ratio`).Phase 4〜6(既存パイプライン統合・PNG/DNG 検証・SPEC 更新)は継続中. + ## 背景 (Background) ### 三項プロジェクトの関係 diff --git "a/docs/05_TECH/TECH_02_SmTIAS-LightSim\343\201\270\343\201\256\345\274\225\343\201\215\347\266\231\343\201\216.md" "b/docs/05_TECH/TECH_02_SmTIAS-LightSim\343\201\270\343\201\256\345\274\225\343\201\215\347\266\231\343\201\216.md" index df3dc94..53021a1 100644 --- "a/docs/05_TECH/TECH_02_SmTIAS-LightSim\343\201\270\343\201\256\345\274\225\343\201\215\347\266\231\343\201\216.md" +++ "b/docs/05_TECH/TECH_02_SmTIAS-LightSim\343\201\270\343\201\256\345\274\225\343\201\215\347\266\231\343\201\216.md" @@ -10,17 +10,20 @@ | --- | --- | --- | | Phase 1 | DNG 読み込み I/F (`dng_loader.py`) | ✅ **完了**(コピー対象) | | Phase 2 | メタデータ JSON 読み込み I/F (`metadata_loader.py`) | ❌ 未実装 | -| Phase 3 | LSC マップ参照・hot pixel マスク | △ LSC 順適用はプロトタイプのみ(`run_uniformity_dng.py` 内) | +| Phase 3 | LSC マップ参照・hot pixel マスク | △ LSC 順適用は `src/io/dng_pipeline.py`(`lsc_gain_rgb` / `dng_luminance`)に実装済み.hot pixel マスクは未実装 | | Phase 4〜6 | 既存パイプライン統合 / PNG vs DNG / SPEC 更新 | ❌ 未着手 | ## 2. コピー対象ファイル (Files to copy) | コピー元(SmTIAS-Evaluation) | コピー先(SmTIAS-LightSim) | 区分 | | --- | --- | --- | -| `src/io/dng_loader.py` | `src/sm_tias_lightsim/evaluation/dng_loader.py` | ★ 正規コピー対象 | -| `scripts/run_uniformity_dng.py` | (参考)`cli/` 等に統合 | LSC 順適用・向き合わせ・評価フローの参考 | +| `src/io/dng_loader.py` | `src/sm_tias_lightsim/evaluation/dng_loader.py` | ★ 正規コピー対象(DNG 低レベル読み込み) | +| `src/io/dng_pipeline.py` | `src/sm_tias_lightsim/evaluation/dng_pipeline.py` | ★ 正規コピー対象(LSC 順適用・portrait 化・Rec.709 輝度化) | +| `scripts/run_uniformity_dng.py` | (参考)`cli/` 等に統合 | 評価フロー(読み込み→ROI→指標→出力)の参考 | | `src/analysis/spatial.py` の `calc_radial_min_max_ratio` | 既存 spatial/uniformity 相当へ**マージ** | 動径 min/max 比指標(追加指標) | +- `dng_pipeline.py` は Rec.709 係数を `analysis/uniformity.py` から import している(コピー先では係数の出所を合わせること). + - **ファイル先頭にコピー元を明記**(TECH_01 指定): ```python """DNG 読み込みモジュール. @@ -36,7 +39,7 @@ 以下は実装の前提であり,**TECH_01(要求仕様)の記述と食い違う点を含む**.必ず反映すること. -1. **DNG は LSC 未補正 — `apply_lsc_inverse` は誤り**: RAW_SENSOR DNG はレンズシェーディング**未補正**(補正は DNG OpcodeList2 の GainMap / meta.json lscMap として付随するが rawpy は適用しない).TECH_01 の `apply_lsc_inverse`(「DNG=補正済み」前提で逆適用)は実態と逆.照明ムラを測るには **lscMap を順方向に適用**してレンズビネットを除去する(`image × interpolate(lscMap)`). +1. **DNG は LSC 未補正 — `apply_lsc_inverse` は誤り**: RAW_SENSOR DNG はレンズシェーディング**未補正**(補正は DNG OpcodeList2 の GainMap / meta.json lscMap として付随するが rawpy は適用しない).TECH_01 の `apply_lsc_inverse`(「DNG=補正済み」前提で逆適用)は実態と逆.照明ムラを測るには **lscMap を順方向に適用**してレンズビネットを除去する(`image × interpolate(lscMap)`.実装: `dng_pipeline.lsc_gain_rgb` で補間ゲインを生成し `dng_luminance` で順適用). 2. **linear 系出力は `output_color=raw`**: カラーマトリクスを通すとチャンネル混合で per-channel 比例が崩れる.`rgb_float32`/`luma_float32` は `output_color=rawpy.ColorSpace.raw` で読む(`rgb_uint8` のみ sRGB).これにより入射光量とセンサ信号の比例(放射輝度リニアリティ)を担保. 3. **向き**: DNG はセンサ native が **landscape**.PNG/preview と同じ portrait にするには `rot90(-1)`(左右反転なし.フロントカメラ id=1 の preview はミラーされるが RAW はミラーされない). 4. **luma の Rec.709 は固定加重プロキシ**: `output_color=raw` では Rec.709 luma は厳密な CIE 輝度ではなく,既存 PNG 経路互換の固定加重.