# 解析処理仕様 (Analysis Pipeline Specification)

1 枚の舌画像から特徴量を得るまでの処理を定める．本書は v2.7 時点の動作を記録したものであり，コード整理ではここに書いた処理結果を変えないことを合格基準とする（[要件定義書](../03_PLAN/PLAN_01_要件定義書.md) の非機能要件）．

## 全体の流れ (Overview)

```text
入力画像
  │ （Image&Calib のみ）色補正 → L*a*b* 画像
  ▼
1. 舌検出 ──────────── 失敗 → "Tongue detection error"
  ▼
2. 舌領域抽出（セグメンテーション → 二値化 → 必要なら小領域除去）
  │                    失敗 → "Tongue segmentation error"
  ▼
3. マスク作成・舌の切り出し
  ▼
4. 形状特徴の算出
  ▼
5. 領域分割（Chiu 法・拡張 Chiu 法・5 点法）
  ▼
6. 領域ごとの色・テクスチャ特徴の算出
  ▼
7. analysis.csv に 1 行追記
```

## 色補正 (Color Calibration)

Image&Calib モードのみ．舌画像と，同名のカラーチャート画像を使う．

- `rgb2lab\TongueAnalysis.exe <舌画像> <カラーチャート画像> <出力CSV>` を実行し，画素ごとの L\*a\*b\* 値を CSV に得る
- CSV から L\*a\*b\* 画像を作り，BGR に変換して表示・後続処理に使う
- 以降の舌検出・舌領域抽出はこの補正後の画像で行う．舌の切り出しは元の画像で行う
- 色特徴（手順 6）は L\*a\*b\* の値で算出する

## 1. 舌検出 (Tongue Detection)

| 項目 | 内容 |
| --- | --- |
| モデル | `models/Detection_Normal.pb`（TensorFlow Object Detection API） |
| 前処理 | 画像を JPEG にエンコード → 256×256 に縮小 |
| 採用する矩形 | スコアが 0.5 を超える検出のうち，最もスコアが高いもの |
| 出力 | 元画像の座標系に戻した舌の矩形 |
| 失敗条件 | 該当する検出が無い，または例外が起きた |

## 2. 舌領域抽出 (Tongue Segmentation)

1. 検出した矩形で画像を切り出し，256×256 に縮小する
2. `models/ResUNet.onnx` で推論する（入力は BGR を 255 で割った値，出力は 2 チャネルのうち 1 チャネル目にシグモイドをかけたもの）
3. 推論結果を大津の二値化で二値画像にする
4. 二値画像の輪郭を数える（Canny でエッジを出してから輪郭を抽出）．輪郭が 0 個，または 3 個以上なら小領域除去を行う
   - `RemoveSmallRegionDLL.dll` で面積 500 画素未満の領域を除去する（2 回実行．設定が異なる）
   - 除去後も輪郭が 0 個，または 3 個以上なら失敗とする

## 3. マスク作成・舌の切り出し (Mask & Extraction)

- 二値画像を検出矩形の大きさに戻し，元画像と同じ大きさのマスクに貼り付ける
- マスクで元画像から舌を切り出す

## 4. 形状特徴 (Shape Features)

| 特徴量 | 内容 |
| --- | --- |
| width / height | 検出した矩形の幅・高さ |
| area | マスクの画素数（舌の面積） |
| topLeftX / topLeftY / bottomRightX / bottomRightY | 検出した矩形の左上・右下の座標 |

## 5. 領域分割 (Region Division)

マスクを舌の部位ごとに分ける．3 つの方法すべてを実行する．

| 方法 | 名前 | 領域 | 概要 |
| --- | --- | --- | --- |
| Chiu 法 | `chiu` | lateral（舌辺），middle（舌中），tip（舌尖） | 舌尖は下から高さ 20%，舌辺は左右それぞれ幅 20% |
| 拡張 Chiu 法 | `exChiu` | 上記＋root（舌根） | Chiu 法に，上から高さ 20% の舌根を加える |
| 5 点法（自動版） | `fiveClick` | lateral，root，middle，tip | 舌の輪郭と重心から 5 点法の基準点を自動で求め，そこから得た 8 点で分ける |

- ※ 5 点法は本来，人が画像上で 5 点をクリックする手法（海沼 2015，石川 2010）．本アプリではクリックせず自動で点を求める．

## 6. 色・テクスチャ特徴 (Color & Texture Features)

`python\TongueFeatures.exe <画像> <領域マスク> <色統計CSV> <GLCM CSV>` を領域分割の方法ごとに実行する．

| 種類 | 特徴量 | 対象 |
| --- | --- | --- |
| 色統計量 | min，median，mean，max，variance，skewness，kurtosis | 領域 × チャネル（Image: B・G・R，Image&Calib: L・a・b） |
| GLCM（テクスチャ） | contrast，dissimilarity，homogeneity，ASM，energy，correlation | 領域ごと |

## 7. 結果の集約 (Aggregation)

画像 1 枚につき `analysis.csv` に 1 行を追記する．列の並びは [入出力仕様](SPEC_03_入出力仕様.md) を参照．
