diff --git a/CLAUDE.md b/CLAUDE.md index de7e27c..722144e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -71,3 +71,4 @@ ### 07_REPORT(報告書) - 照明均一性評価報告書: docs/07_REPORT/REPORT_01_照明均一性評価報告書.md +- PNG/DNG 評価比較報告書: docs/07_REPORT/REPORT_02_PNG_DNG評価比較報告書.md diff --git "a/docs/07_REPORT/REPORT_02_PNG_DNG\350\251\225\344\276\241\346\257\224\350\274\203\345\240\261\345\221\212\346\233\270.md" "b/docs/07_REPORT/REPORT_02_PNG_DNG\350\251\225\344\276\241\346\257\224\350\274\203\345\240\261\345\221\212\346\233\270.md" new file mode 100644 index 0000000..db04287 --- /dev/null +++ "b/docs/07_REPORT/REPORT_02_PNG_DNG\350\251\225\344\276\241\346\257\224\350\274\203\345\240\261\345\221\212\346\233\270.md" @@ -0,0 +1,101 @@ +# PNG / DNG 照明均一性評価 比較報告書 (PNG vs DNG Uniformity Evaluation Comparison) + +## 概要 (Overview) + +MiniTIAS 撮影アプリの定量撮影モードの出力フォーマットが **PNG から DNG (RAW_SENSOR) に変更**された([TECH_01](../05_TECH/TECH_01_DNG対応要求仕様.md))ことに伴い,照明均一性評価の結果が PNG 経路と DNG 経路でどのように変わるかを比較した. + +結論を先に述べると,**PNG→DNG は単なるファイル形式の変更ではなく,「何を測っているか」が変わる**.PNG は sRGB エンコード済み・端末 ISP でレンズシェーディング補正済みの「処理後」データであり,DNG は linear・補正前の「物理生信号」である.このため評価指標の数値は大きく変化する. + +## 前提・対象データ (Scope and Samples) + +| 項目 | 内容 | +| --- | --- | +| PNG サンプル | `data/minitias/whiteboard/MiniTIAS_20260408_140317.png`(2026-04-08 撮影) | +| DNG サンプル | `data/minitias/quantitative/MiniTIAS_QM_20260601_102753.dng`(2026-06-01 撮影,SH-02M 定量モード) | +| 評価領域 (ROI) | `config/roi_config.json` の `minitias.whiteboard`(白板中央,全条件で同一) | +| 向き | portrait に統一(DNG は landscape native のため `rot90(-1)` で PNG と整合) | +| 評価指標 | CoV / max-min比 / 中心-周辺比 / 勾配 / 動径 min/max 比(20点輪帯平均の最小/最大) | + +> **重要な前提(本報告書の限界)**: PNG(4月)と DNG(6月)は**別セッションの撮影でフレーミングが異なる**.したがって本報告書は,TECH_01 の検証 V1 が要求する「同一シーンを PNG/DNG で連続撮影した厳密な対照比較」**ではない**.**評価手法・ドメインの違いが指標に与える影響**を既存サンプルで定量的に示すものである.厳密な同一シーン比較は今後の課題(後述). + +## 評価条件(ドメイン)の違い (Domain Differences) + +PNG 経路と DNG 経路は,評価に入る前の信号の性質が根本的に異なる. + +| 観点 | PNG(従来) | DNG(新規・定量モード) | +| --- | --- | --- | +| 信号ドメイン | **sRGB**(OETF/ガンマ適用済み) | **linear**(TONEMAP=CONTRAST_CURVE_LINEAR,OETF 未適用) | +| レンズシェーディング | **端末 ISP で補正済み**(SHADING_MODE=HIGH_QUALITY が YUV/JPEG に適用) | **未補正**(RAW_SENSOR は ISP 前.補正は DNG OpcodeList2 の GainMap / meta.json の lscMap として付随するのみ) | +| ビット深度 | 8bit | 10bit | +| 入射光量との関係 | ガンマで非線形 | **比例(放射輝度リニア)** | + +→ つまり PNG をそのまま評価した「従来値」と,DNG を物理的に正しく評価した値は,**同じものを測っていない**.公平に比較するにはドメインを揃える必要がある. + +## 結果比較 (Results) + +同一 ROI で算出した均一性指標(数値が大きいほどムラが大きい.動径 min/max のみ 1.0 に近いほど均一): + +| 条件 | CoV | max/min | 中心/周辺比 | 勾配(%) | 動径 min/max | +| --- | --- | --- | --- | --- | --- | +| **PNG sRGB(従来評価)** | 0.0423 | 1.387 | 1.066 | 6.23 | 0.8964 | +| PNG 擬似linear化(inverse-sRGB 仮定)※ | 0.0901 | 2.031 | 1.148 | 12.88 | 0.7902 | +| DNG linear(LSC 補正なし) | 0.1477 | 2.287 | 1.456 | 31.33 | 0.5304 | +| **DNG linear(LSC 補正あり)** | 0.0689 | 1.641 | 1.095 | 8.69 | 0.8533 | + +> ※ **「PNG 擬似linear化」は近似であり,真のシーン linear(入射光量比例)ではない**.詳細は考察「4. PNG は厳密には linear 化できない」を参照. + +## 考察:なぜ結果が変わるのか (Analysis) + +数値変化は主に3つの要因に分解できる. + +### 1. ドメイン(sRGB ガンマ)の影響 — 最大の要因 + +同じ PNG データでも,**sRGB のまま(CoV 0.0423)か擬似linear化(CoV 0.0901)かで CoV が約2倍**変わる(撮影は同一,ドメインのみ変更).sRGB の OETF は暗部を持ち上げ明部を圧縮するため,**ムラを実際より穏やかに見せる**.従来の PNG 評価値(CoV 0.042)は,このガンマ圧縮により**楽観的に小さく出ていた**. + +なお CoV・max/min・動径比は**スケール不変**なので,0〜255 と 0〜1 のスケール差では変わらない.変化はあくまでドメイン(ガンマ)によるもの. + +### 2. レンズシェーディング補正の有無 + +DNG raw は未補正のため,**レンズビネット(端ほど暗い)が指標に混入**する.LSC 補正なしの DNG は中心/周辺比 1.456・勾配 31.3%・動径 min/max 0.530 と大きなムラを示すが,これは**照明ムラではなくレンズ特性**を多く含む.lscMap を順方向適用してレンズビネットを除去すると,中心/周辺比 1.456→1.095,勾配 31.3%→8.7%,動径 min/max 0.530→0.853 と**劇的に平坦化**する(残りが照明そのもののムラ). + +### 3. 撮影セッションの違い + +PNG(4月)と DNG(6月)は別撮影で,照明配置・フレーミング・距離が異なる.この差も数値に含まれるため,厳密な大小比較はできない(前提参照). + +### 4. PNG は厳密には linear 化できない(重要な限界) + +上表の「PNG 擬似linear化」は inverse-sRGB OETF を掛けたものだが,これは**真のシーン linear(入射光量比例)を復元しない**.理由: + +- **透過関数が不明**: 本サンプル PNG は ICC プロファイル・gAMA・EXIF を一切持たず,**sRGB である保証すらない**(sRGB と仮定して逆変換しているだけ). +- **トーンカーブが残る(最大の壁)**: 端末 PNG は `linear生信号 →[WB・カラー行列・レンズ補正・トーンカーブ・NR・シャープ化]→ 表示RGB → sRGB符号化 → 8bit` を経る.inverse-sRGB が戻せるのは最後の符号化だけで,得られるのは「**表示参照 linear**」.間のトーンカーブ(端末固有・非公開のコントラスト曲線)は焼き込まれたままで,入射光量には比例しない. +- **不可逆な損失**: 8bit 量子化(暗部の段差が逆ガンマで増幅)・クリップ(白飛び/黒潰れ)は復元不能. + +→ つまり **PNG は確実には linear 化できない**.これこそが定量 DNG モード採用の理由([TECH_01](../05_TECH/TECH_01_DNG対応要求仕様.md) 背景「実機 PNG 自体が定量データとして揺らぐ」)であり,DNG (RAW_SENSOR, TONEMAP=CONTRAST_CURVE_LINEAR) は最初から真のシーン linear を出すことでこの問題を回避する. + +### 公平な比較(ドメインを揃える,ただし近似) + +両者を linear ドメインに寄せると比較の目安は得られる(PNG は上記の通り**擬似linear=近似**である点に注意): + +- **PNG 擬似linear化: CoV 0.0901**(近似) vs **DNG linear+LSC: CoV 0.0689**(真の linear) +- → 目安としては **DNG(LSC補正)の方が均一**.従来の「PNG 0.042 < DNG 0.069 で DNG が悪い」という見え方は,sRGB ガンマが PNG のムラを圧縮していた錯覚. +- ただし PNG 側が近似である以上この比較は厳密ではなく,**確実な比較には同一シーンを DNG で撮影することが必要**(後述 残課題). + +## 結論と推奨 (Conclusion) + +1. **PNG→DNG の移行で評価値が変わるのは正常**.主因は形式ではなく,sRGB→linear のドメイン変化とレンズシェーディング補正の有無. +2. **物理的に正しい照明均一性評価は DNG linear + LSC 補正経路**で行うべき.入射光量に比例した信号で,レンズ特性を分離して照明ムラのみを測れる. +3. 従来の **PNG sRGB 評価値は,ガンマ圧縮によりムラを過小評価**していた点に注意.過去の PNG 値と DNG 値を近づけるには PNG を擬似linear化(inverse-sRGB)できるが,**PNG は真のシーン linear を復元できない**(トーンカーブ・8bit・透過関数不明のため).したがって**厳密な比較には DNG での再撮影が必要**. +4. ノイズに弱い画素単位 max/min 比に代わり,**動径 min/max 比(20点輪帯平均)**をロバストな減衰指標として併用する. + +## 残課題 (Open Issues) + +- **厳密な V1 比較**: 同一シーン(白板)を同一フレーミングで PNG(通常モード)+ DNG(定量モード)連続撮影し,同条件で比較する([TECH_01](../05_TECH/TECH_01_DNG対応要求仕様.md) 検証 V1). +- **ROI のフレーミング差対応**: PNG/DNG で白板の写る位置・スケールが異なるため,キャプチャごとの ROI 調整または同一フレーミング撮影が必要(TECH_01 Phase 5). +- **LSC 順適用機能の正式実装**: 現状は検証スクリプトでの順適用.本流の評価フローへ正式統合する(TECH_01 Phase 3〜4). + +## 参照 (References) + +- [TECH_01 DNG 対応要求仕様](../05_TECH/TECH_01_DNG対応要求仕様.md) +- [REPORT_01 照明均一性評価報告書](REPORT_01_照明均一性評価報告書.md) +- 評価実装: `src/io/dng_loader.py`, `src/analysis/spatial.py`, `scripts/run_uniformity_dng.py` +- 設計判断・経緯の詳細: `docs/PROGRESS.md`