Metadata-Version: 2.4
Name: img2ppt
Version: 1.4.0
Summary: スライド画像/PDF から PowerPoint を自動生成するパイプライン (Windows 専用)
Author: kirin123
License-Expression: MIT
Keywords: powerpoint,ocr,pptx,slide,image
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: End Users/Desktop
Classifier: Operating System :: Microsoft :: Windows :: Windows 11
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Multimedia :: Graphics :: Presentation
Requires-Python: >=3.12
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: Pillow>=10.4.0
Requires-Dist: opencv-python>=4.11.0
Requires-Dist: numpy>=1.26.4
Requires-Dist: python-pptx>=1.0.0
Requires-Dist: pypdfium2<3.0,>=0.28.0
Requires-Dist: locro>=0.1.0
Dynamic: license-file

# img2ppt

スライド画像（JPG/PNG）または PDF を PowerPoint（.pptx）に自動変換するツールです。  
テキスト・図形・背景を自動認識し、16:9 スライドとして再構成します。

> **動作環境**: Windows 11 専用 / Python 3.12 以上 / Google Chrome 必須（初回セットアップのみ）

---

## インストール

```cmd
pip install .
```

全依存ライブラリ（OpenCV / Pillow / python-pptx / pypdfium2 / locro 等）が一括インストールされます。

### 初回セットアップ（Chrome Screen AI コンポーネントの取得）

**初回のみ**、Google Chrome をインストールした状態で以下を実行してください。

```cmd
:: Chrome の Screen AI コンポーネントをローカルにコピー（約 107MB）
locro download
```

以降はオフラインで動作します。Chrome は引き続きインストール不要です。

### インストール確認

```cmd
img2ppt --help
```

---

## 使い方

### 基本

```cmd
:: 画像ファイルを変換
img2ppt スライド.jpg -d 出力フォルダ

:: クリップボードの画像を変換（引数なし）
img2ppt -d 出力フォルダ

:: PDF を変換（全ページ → 1 ファイルの PPTX）
img2ppt 資料.pdf -d 出力フォルダ
```

### 入力モード

| モード | 方法 | 説明 |
| --- | --- | --- |
| ファイル指定 | `img2ppt <ファイルパス>` | JPG / PNG / PDF を直接指定 |
| クリップボード | `img2ppt`（引数なし） | 画像をコピーしてからそのまま実行 |
| PDF | 拡張子 `.pdf` のファイルを指定 | 全ページを 1 つの PPTX にまとめる |

---

## 出力ファイル

`-d` で指定したディレクトリに以下が出力されます。

| ファイル | 説明 |
| --- | --- |
| `{stem}.pptx` | **最終 PowerPoint** |
| `{stem}.json` | 認識結果の構造化 JSON |
| `{stem}_04_inpainted.png` | テキスト除去後の画像 |
| `{stem}_05_1_segment_filled.png` | セグメント検出結果（シルエット） |
| `{stem}_05_2_mask_segment.png` | セグメントマスク画像 |
| `{stem}_06_1_content_inpainted.png` | コンテンツ除去後の画像 |
| `{stem}_06_2_mask_colorize.png` | カラー分割マスク |
| `{stem}_06_3_colorized.png` | カラー分割結果 |

デバッグ用の可視化画像（`vis_` プレフィックス）は `--debug` を付けると追加出力されます。

---

## オプション一覧

### 基本オプション

| オプション | デフォルト | 説明 |
| --- | --- | --- |
| `-d`, `--output-dir` | `test/` | 出力ディレクトリ |
| `-o`, `--output-json` | 自動 | 最終 JSON の出力パス（単一ページ時のみ有効） |
| `-v`, `--verbose` | オフ | 詳細ログを表示（省略時はプログレスバーのみ） |
| `--debug` | オフ | デバッグ用可視化画像（`vis_xxx`）を出力 |
| `--clean-tmp` | オフ（＝デフォルトで一時ディレクトリは保持） | 処理後に一時ディレクトリを削除する |
| `--tmp-dir` | システム一時領域 | 一時ディレクトリの作成場所を指定 |
| `--pdf-dpi` | `150` | PDF ページ変換の解像度（DPI） |

### 出力パス個別指定

| オプション | 説明 |
| --- | --- |
| `--output-inpaint` | Step4 テキスト除去画像の出力パス |
| `--output-seg-filled` | Step5 シルエット画像の出力パス |
| `--output-mask-seg` | Step5 マスク画像の出力パス |

### 画像鮮明化（Step1）

低解像度・圧縮ノイズが多い画像の OCR 精度を上げるための前処理です。  
PNG または長辺 1280px 以上の JPG は自動スキップされます。

| オプション | デフォルト | 説明 |
| --- | --- | --- |
| `--denoise-h` | `10` | ノイズ除去強度（大きいほど強く除去、ぼけやすい） |
| `--bilateral-d` | `9` | エッジ保持フィルタの近傍径 |
| `--sigma-color` | `60.0` | エッジ保持フィルタの色シグマ |
| `--sigma-space` | `60.0` | エッジ保持フィルタの空間シグマ |
| `--unsharp-radius` | `2` | 輪郭強調の半径（px） |
| `--unsharp-percent` | `200` | 輪郭強調の強度（%） |
| `--unsharp-threshold` | `2` | 輪郭強調の閾値 |

### テキスト除去（Step4）

| オプション | デフォルト | 説明 |
| --- | --- | --- |
| `--sample-offset` | `3` | 背景色サンプリング位置（bbox 端から何 px 外側か） |
| `--fill-expand` | `2` | テキスト除去の塗り範囲拡張量（px） |

### セグメント検出（Step5）

| オプション | デフォルト | 説明 |
| --- | --- | --- |
| `--sat-max` | `40` | 背景とみなす最大彩度（HSV-S、0〜255） |
| `--val-min` | `200` | 背景とみなす最小輝度（HSV-V、0〜255） |

### OCR 品質フィルタ（Step2.5）

| オプション | デフォルト | 説明 |
| --- | --- | --- |
| `--ocr-min-height` | `8` | bbox 最小高さ（px）。これ未満は除外 |
| `--ocr-threshold` | `0.85` | confidence 閾値（0.0〜1.0）。これ未満の word を除外 |

### PowerPoint 生成（Step7）

| オプション | デフォルト | 説明 |
| --- | --- | --- |
| `--bg-tolerance` | `20` | 図形の背景透過許容幅（RGB 各チャンネル ±n） |

---

## 実行例

```cmd
:: 高解像度 PDF を変換
img2ppt 資料.pdf -d C:\output --pdf-dpi 200

:: デバッグ: 全中間ファイルを残して詳細ログを表示（一時ディレクトリはデフォルトで保持される）
img2ppt スライド.jpg -d C:\output --debug --verbose

:: クリップボード画像を変換してデスクトップに保存
img2ppt -d %USERPROFILE%\Desktop

:: OCR フィルタを緩めて誤除外を減らす
img2ppt スライド.jpg -d C:\output --ocr-threshold 0.35
```

---

## うまくいかないときは

| 症状 | 試すこと |
| --- | --- |
| テキストが認識されない | `--ocr-threshold` を下げる（例: `0.35`） |
| 誤認識テキストが残る | `--ocr-threshold` を上げる（例: `0.55`） |
| 背景色で塗りつぶしがうまくいかない | `--sample-offset` や `--fill-expand` を調整する |
| 図形の背景が透過しすぎる / されない | `--bg-tolerance` を調整する（大きくすると透過が広がる） |
| 低彩度アイコンが検出されない | `--sat-max` を上げる（例: `50`） |
| 処理の途中経過を確認したい | `--debug --verbose` を付けて実行する（一時ディレクトリはデフォルトで保持される） |

---

## パイプライン概要

| ステップ | モジュール | 処理内容 |
| --- | --- | --- |
| Step1 | `clarify.py` | 画像鮮明化（ノイズ除去・輪郭強調） |
| Step2 | `ocr.py` | Chrome Screen AI でテキスト検出・認識（word 単位） |
| Step2.5 | `ocr_filter.py` | geometric / confidence スコアで低品質 word を除外 |
| Step3 | `split.py` | OCR bbox の autofit（tight_fit）処理 |
| Step4 | `inpaint.py` | テキスト領域を背景色で除去・修復 |
| Step5 | `segment.py` | HSV 2値化 + 連結成分ラベリングでオブジェクト検出 |
| Step6 | `colorize.py` | container を投影プロファイル法で矩形分割・内包正規化 |
| Step7 | `pptx_gen.py` | JSON + 中間画像から PowerPoint スライドを生成 |

---

## 依存ライブラリ

| ライブラリ | ライセンス | 用途 |
| --- | --- | --- |
| `locro` | MIT | Chrome Screen AI OCR（テキスト検出・認識） |
| `opencv-python` | Apache 2.0 | 画像処理 |
| `Pillow` | HPND（MIT互換） | 画像入出力 |
| `numpy` | BSD | 配列処理 |
| `python-pptx` | MIT | PowerPoint ファイル生成 |
| `pypdfium2` | Apache 2.0 | PDF → 画像変換 |

---

## ライセンス

MIT License
