# アーキテクチャ設計 (Architecture)

## ディレクトリ構造 (Directory Structure)

```text
SmTIAS-Evaluation/
├── src/
│   ├── config.py               # ROI 設定（roi_config.json）の読み込み
│   ├── io/
│   │   ├── loader.py           # PNG 読み込み・ROI 抽出（OpenCV）
│   │   ├── dng_loader.py       # DNG(RAW_SENSOR) 読み込み（rawpy, linear 展開）
│   │   └── dng_pipeline.py     # DNG 輝度化（LSC 補正・portrait 化・Rec.709 輝度化）
│   ├── analysis/
│   │   ├── uniformity.py       # 照明均一性指標（CoV, 標準偏差, max/min, Rec.709 輝度）
│   │   ├── spatial.py          # 空間解析（ゾーン・中心周辺勾配・動径プロファイル・動径 min/max 比）
│   │   ├── registration.py     # 位相相関による並進位置合わせ
│   │   └── reproducibility.py  # 位置合わせ付き SSIM 再現性評価
│   ├── visualization/
│   │   └── plotter.py          # 輝度マップ・ヒストグラム・動径プロファイル・ゾーンマップ（Matplotlib）
│   └── export/
│       └── exporter.py         # CSV 出力・バッチ集計（csv, NumPy）
├── scripts/
│   ├── run_uniformity.py       # PNG 解析ランナー（単一画像／ディレクトリ一括）
│   ├── run_uniformity_dng.py   # DNG 解析ランナー
│   ├── select_roi.py           # 対話的 ROI 選択（OpenCV）
│   ├── viewer.py               # 結果ビューア（Streamlit）
│   └── compare_*.py / plot_radial_clean.py  # 報告書用の比較図・クリーン出力
├── tests/
├── 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）+ 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)

| モジュール | 責務 | 主な依存 |
| --- | --- | --- |
| `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, 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）
