絵画画像を色で検索できるデスクトップアプリケーション(Streamlit使用)
このアプリケーションは、画像コレクションから特定の色を含む画像を簡単に検索できるツールです。k-meansクラスタリングを使用して各画像から代表色を抽出し、色の類似度で検索を行います。
- 指定フォルダ内の画像ファイル(.jpg, .jpeg, .png)をスキャン
- k-meansクラスタリングで各画像から代表色を3色抽出
- 画像情報と色情報をSQLiteデータベースに保存
- プログレスバーで進捗を表示
- カラーピッカーで検索したい色を選択
- 選択した色と各画像の代表色との距離を計算(ユークリッド距離)
- 距離が近い順に画像を表示
- サムネイルグリッド形式で表示(4列)
- 各画像の代表色3色をカラーチップで表示
- 検索色との距離値を表示
- Python 3.10+
- Streamlit - UIフレームワーク
- SQLite - データベース
- Pillow - 画像処理
- scikit-learn - k-meansクラスタリング
- numpy - 数値計算
- Python 3.10以上
- uv パッケージマネージャー
# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"git clone <repository-url>
cd color-checker# 仮想環境を作成し、依存パッケージをインストール
uv syncuv run streamlit run app.pyブラウザが自動的に開き、アプリケーションが表示されます(通常は http://localhost:8501)
- プロジェクト内に画像用フォルダーを作成(例:
images,paintingsなど) - そのフォルダーに絵画画像をコピー(.jpg, .jpeg, .png対応)
デフォルトフォルダー:
images/フォルダーが既に用意されています- ここに画像を配置すれば、すぐに使い始められます
- サイドバーに表示されているフォルダーボタンをクリック
- 例: 📁
images
- 例: 📁
- フォルダーが見つかると ✓ マークが表示されます
- 「🔄 スキャン実行」ボタンをクリック
- プログレスバーで進捗を確認
- サイドバーの「またはフォルダー名を入力」欄にフォルダー名を入力
- 例:
images,paintings
- 例:
- フォルダーが存在しない場合は、作成ボタンが表示されます
- 「🔄 スキャン実行」ボタンをクリック
- メインエリアのカラーピッカーで検索したい色を選択
- 表示件数をスライダーで調整(5〜50件)
- 「🔍 検索実行」ボタンをクリック
- 結果がグリッド形式で表示されます
サイドバーの「🗑️ データベースをクリア」ボタンで、保存されている全ての画像情報を削除できます。
color-checker/
├── app.py # Streamlitメインアプリケーション
├── db.py # データベース操作
├── color_extractor.py # 色抽出ロジック
├── pyproject.toml # プロジェクト設定(uv管理)
├── database.db # SQLiteデータベース(自動生成)
├── .gitignore # Git除外設定
├── README.md # このファイル
└── images/ # 画像フォルダー(デフォルト)
└── README.md # 画像配置の説明
| カラム名 | 型 | 説明 |
|---|---|---|
| id | INTEGER | 主キー(自動採番) |
| file_path | TEXT | 画像ファイルの絶対パス |
| file_name | TEXT | ファイル名 |
| color1_r, color1_g, color1_b | INTEGER | 代表色1のRGB値 |
| color2_r, color2_g, color2_b | INTEGER | 代表色2のRGB値 |
| color3_r, color3_g, color3_b | INTEGER | 代表色3のRGB値 |
| scanned_at | TIMESTAMP | スキャン日時 |
- 画像を読み込み、RGB形式に変換
- 処理速度向上のため最大800pxにリサイズ
- 全ピクセルのRGB値を取得
- k-meansクラスタリング(k=3)で代表色を抽出
- クラスタ中心をRGB値として取得
distance = √((R1-R2)² + (G1-G2)² + (B1-B2)²)
各画像について:
- 3つの代表色それぞれと検索色との距離を計算
- 最小距離を画像の距離値とする
- 距離値でソートして上位N件を返す
- 処理速度: 30枚で約10秒以内(画像サイズや環境により変動)
- 推奨画像数: 30〜100枚(テスト規模)
- 最大画像サイズ: 処理時に800pxにリサイズ
- 読み込めない画像はスキップし、ログに記録
- ファイルが存在しない場合は警告を表示
- データベースエラーは適切にキャッチして通知
- タグ機能の追加
- AI画像認識との統合
- 複数色同時検索
- 2000枚規模対応の最適化
- 色空間の改善(Lab色空間など)
MIT License
- app.py: Streamlit UI、メインロジック、検索処理
- db.py: SQLite操作(初期化、挿入、取得、クリア)
- color_extractor.py: k-means色抽出、距離計算
各モジュールでloggingを使用してエラーや処理状況を出力しています。
- 画像ファイルのパスが正しいか確認
- ファイルが移動・削除されていないか確認
- 画像サイズが大きすぎる可能性(自動でリサイズされます)
- 画像数が多い場合は時間がかかります
- database.dbファイルの権限を確認
- 「データベースをクリア」で初期化を試してください
問題や質問がある場合は、GitHubのIssuesにご報告ください。