diff --git "a/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" "b/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" index 8fa3d8e..8a1764a 100644 --- "a/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" +++ "b/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" @@ -5,55 +5,84 @@ ```text SmTIAS-Evaluation/ ├── src/ +│ ├── config.py # ROI 設定(roi_config.json)の読み込み │ ├── io/ -│ │ └── loader.py # 画像読み込み(OpenCV) +│ │ ├── loader.py # PNG 読み込み・ROI 抽出(OpenCV) +│ │ ├── dng_loader.py # DNG(RAW_SENSOR) 読み込み(rawpy, linear 展開) +│ │ └── dng_pipeline.py # DNG 輝度化(LSC 補正・portrait 化・Rec.709 輝度化) │ ├── analysis/ -│ │ ├── uniformity.py # 照明均一性評価 -│ │ └── color.py # 色再現性評価(ΔE,L*a*b*) +│ │ ├── uniformity.py # 照明均一性指標(CoV, 標準偏差, max/min, Rec.709 輝度) +│ │ ├── spatial.py # 空間解析(ゾーン・中心周辺勾配・動径プロファイル・動径 min/max 比) +│ │ ├── registration.py # 位相相関による並進位置合わせ +│ │ └── reproducibility.py # 位置合わせ付き SSIM 再現性評価 │ ├── visualization/ -│ │ └── plotter.py # グラフ・図の生成(Matplotlib) +│ │ └── plotter.py # 輝度マップ・ヒストグラム・動径プロファイル・ゾーンマップ(Matplotlib) │ └── export/ -│ └── exporter.py # CSV・画像の出力(pandas) +│ └── exporter.py # CSV 出力・バッチ集計(csv, NumPy) ├── scripts/ -│ └── run_analysis.py # 実行エントリーポイント +│ ├── run_uniformity.py # PNG 解析ランナー(単一画像/ディレクトリ一括) +│ ├── run_uniformity_dng.py # DNG 解析ランナー +│ ├── select_roi.py # 対話的 ROI 選択(OpenCV) +│ ├── viewer.py # 結果ビューア(Streamlit) +│ └── compare_*.py / plot_radial_clean.py # 報告書用の比較図・クリーン出力 ├── tests/ -├── data/ -│ ├── smtias/whiteboard/ -│ └── tias/whiteboard/ -└── output/ +├── config/ +│ └── roi_config.json # ROI 定義(キー: smtias.whiteboard 等) +├── data/ # 入力画像(.gitignore 対象) +│ ├── smtias/{whiteboard,quantitative}/ +│ └── tias/whiteboard/ # TIAS は今後取得(現状空) +└── output/ # 解析結果(.gitignore 対象) + ├── figures/ + └── results/ ``` ## 処理パイプライン (Processing Pipeline) ```text -PNG 画像 - ↓ loader.py 画像読み込み(OpenCV,BGR→RGB) - ↓ loader.py ROI 抽出(解析対象領域の切り出し) - ↓ uniformity.py 輝度分布の計算(均一性指標: CoV 等) - color.py 色空間変換(sRGB → L*a*b*)・ΔE 計算 - ↓ plotter.py グラフ生成(輝度マップ,色差分布等) - ↓ exporter.py CSV・PNG 出力 +入力画像 + ├─ PNG → loader.py 読み込み(OpenCV, BGR→RGB)+ ROI 抽出 + └─ DNG → dng_loader.py + dng_pipeline.py + linear 展開・LSC 補正・portrait 化・Rec.709 輝度化 + ROI 抽出 + ↓ uniformity.py 輝度分布・均一性指標(CoV, 標準偏差, max/min) + ↓ spatial.py 空間解析(ゾーン別統計・中心周辺比・勾配・動径プロファイル・動径 min/max 比) + ↓ reproducibility.py (バッチ時)位置合わせ付き SSIM による画像間再現性 + ↓ plotter.py 図生成(輝度マップ・ヒストグラム・動径プロファイル・ゾーンマップ) + ↓ exporter.py CSV 出力・バッチ集計 ``` +アルゴリズムの詳細は [SPEC_02 照明均一性評価アルゴリズム](SPEC_02_照明均一性評価アルゴリズム.md),DNG 経路の詳細は [TECH_01 DNG 対応要求仕様](../05_TECH/TECH_01_DNG対応要求仕様.md) を参照. + ## モジュール設計 (Module Design) | モジュール | 責務 | 主な依存 | | --- | --- | --- | -| `loader.py` | PNG 読み込み・ROI 抽出 | OpenCV,NumPy | -| `uniformity.py` | 輝度分布・均一性指標(CoV,標準偏差等)の算出 | NumPy | -| `color.py` | sRGB→L\*a\*b\* 変換・ΔE2000 計算 | colour-science,scipy | -| `plotter.py` | 輝度マップ・棒グラフ・散布図の生成 | Matplotlib | -| `exporter.py` | 数値結果を CSV,図を PNG で保存 | pandas,Matplotlib | -| `run_analysis.py` | 各モジュールを呼び出す実行スクリプト | 全モジュール | +| `config.py` | ROI 設定 JSON の読み込み | (標準ライブラリ) | +| `io/loader.py` | PNG 読み込み・ROI 抽出 | OpenCV,NumPy | +| `io/dng_loader.py` | DNG(RAW_SENSOR) を linear で読み込み | rawpy,NumPy | +| `io/dng_pipeline.py` | DNG の LSC 補正・portrait 化・Rec.709 輝度化 | NumPy(`uniformity` の係数を参照) | +| `analysis/uniformity.py` | 輝度変換・均一性指標(CoV,標準偏差,max/min)の算出 | NumPy | +| `analysis/spatial.py` | ゾーン分割・中心周辺比・勾配・動径プロファイル・動径 min/max 比 | NumPy | +| `analysis/registration.py` | 位相相関による並進位置合わせ(サブピクセル) | SciPy,NumPy | +| `analysis/reproducibility.py` | 位置合わせ付き SSIM の画像間再現性評価 | scikit-image,NumPy | +| `visualization/plotter.py` | 輝度マップ・ヒストグラム・動径プロファイル・ゾーンマップの生成 | Matplotlib | +| `export/exporter.py` | 数値結果を CSV 保存・バッチ集計 | csv,NumPy | +| `scripts/run_uniformity.py` | PNG 解析の実行(単一/一括) | 全モジュール | +| `scripts/run_uniformity_dng.py` | DNG 解析の実行 | 全モジュール | +| `scripts/select_roi.py` | 対話的 ROI 選択 | OpenCV | +| `scripts/viewer.py` | 結果ビューア | Streamlit,pandas,Pillow | ## 入出力仕様 (I/O Specification) ### 入力 (Input) -- 形式: PNG(8bit RGB) -- 配置: `data/smtias/whiteboard/`,`data/tias/whiteboard/` +- 形式: PNG(8bit RGB, sRGB)/ DNG(RAW_SENSOR, 10bit Bayer → rawpy で linear 展開) +- 配置: `data/smtias/{whiteboard,quantitative}/`,`data/tias/whiteboard/` ### 出力 (Output) - `output/figures/` — グラフ画像(PNG,論文掲載用) - `output/results/` — 数値結果(CSV) + +## 将来導入予定 (Planned) + +- **色再現性評価**(`analysis/color.py`): sRGB → CIE L\*a\*b\* 変換・ΔE2000 計算による TIAS / SmTIAS の色差比較(現状未実装.要件は [PLAN_01](../03_PLAN/PLAN_01_要件定義書.md)・[PLAN_02](../03_PLAN/PLAN_02_開発ステップ.md) ステップ 4) diff --git "a/docs/04_SPEC/SPEC_02_\347\205\247\346\230\216\345\235\207\344\270\200\346\200\247\350\251\225\344\276\241\343\202\242\343\203\253\343\202\264\343\203\252\343\202\272\343\203\240.md" "b/docs/04_SPEC/SPEC_02_\347\205\247\346\230\216\345\235\207\344\270\200\346\200\247\350\251\225\344\276\241\343\202\242\343\203\253\343\202\264\343\203\252\343\202\272\343\203\240.md" index 8999c62..d44b85d 100644 --- "a/docs/04_SPEC/SPEC_02_\347\205\247\346\230\216\345\235\207\344\270\200\346\200\247\350\251\225\344\276\241\343\202\242\343\203\253\343\202\264\343\203\252\343\202\272\343\203\240.md" +++ "b/docs/04_SPEC/SPEC_02_\347\205\247\346\230\216\345\235\207\344\270\200\346\200\247\350\251\225\344\276\241\343\202\242\343\203\253\343\202\264\343\203\252\343\202\272\343\203\240.md" @@ -15,6 +15,8 @@ - $Y$: 輝度(0.0〜255.0, float64) - $R, G, B$: 各チャネルの画素値(0〜255, uint8) +> **DNG 経路**: RAW_SENSOR DNG では同じ Rec.709 係数を linear 値に適用し,PNG 図と軸を揃えるため ×255 スケールで表現する(CoV・max/min・中心周辺比はスケール不変).詳細は [TECH_01](../05_TECH/TECH_01_DNG対応要求仕様.md). + ### 選定理由 | 方法 | 定義 | 不採用の理由 | @@ -132,6 +134,16 @@ - 出力: 20 × 2 の配列(列 0 = ビン中心距離,列 1 = 平均輝度) - 最外ビンは上端を含める($d = 1.0$ の画素を欠損させない) +### 動径 min/max 比 (Radial Min/Max Ratio) + +放射状輝度プロファイル(20 ビンの輪帯平均)の最小値と最大値の比を,外れ画素にロバストな周辺減衰指標として算出する. + +$$\text{Radial Min/Max Ratio} = \frac{Y^{\text{ring}}_{\min}}{Y^{\text{ring}}_{\max}}$$ + +- 値域 $[0, 1]$.1.0 に近いほど均一(周辺減衰が小さい) +- 画素単位の max/min 比と異なり輪帯平均を用いるため,局所ノイズ・外れ画素に頑健 +- 併せて最小輝度ビンの正規化距離(`radial_min_distance`)を報告する + ## 位置合わせ (Image Registration) スマートフォンの取り付け位置の微小なずれを補正し,照明パターンの真の再現性を評価するために,位相相関法による並進位置合わせを実装する [10].