Spaces:
Sleeping
Sleeping
feat: pic-to-header の初期実装
Browse files- pic_to_header/core.py: 画像処理機能の実装
- web_app/app.py: Streamlit アプリケーションの実装
- requirements.txt: 依存関係の更新
- README.md: プロジェクト説明の追加
- tests/test_core.py: ユニットテストの追加
- 不要なファイルの削除 (utils.py, index.html)
この実装により、マスク画像と入力画像からヘッダー画像を生成する基本機能が完成しました。
- README.md +29 -225
- pic_to_header/__init__.py +0 -0
- pic_to_header/core.py +24 -0
- requirements.txt +3 -2
- tests/__init__.py +0 -0
- tests/test_core.py +52 -0
- web_app/__init__.py +0 -0
- web_app/app.py +45 -0
README.md
CHANGED
@@ -1,245 +1,49 @@
|
|
1 |
-
|
2 |
-
<img src="https://raw.githubusercontent.com/Sunwood-ai-labs/HarmonAI_III/refs/heads/main/docs/HarmonAI-III.png" width="100%">
|
3 |
-
<h1 align="center">🌟 HarmonAI III 🌟</h1>
|
4 |
-
</p>
|
5 |
-
|
6 |
-
<p align="center">
|
7 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III">
|
8 |
-
<img alt="GitHub Repo" src="https://img.shields.io/badge/github-HarmonAI__III-blue?logo=github">
|
9 |
-
</a>
|
10 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/blob/main/LICENSE">
|
11 |
-
<img alt="License" src="https://img.shields.io/github/license/Sunwood-ai-labs/HarmonAI_III?color=green">
|
12 |
-
</a>
|
13 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/stargazers">
|
14 |
-
<img alt="GitHub stars" src="https://img.shields.io/github/stars/Sunwood-ai-labs/HarmonAI_III?style=social">
|
15 |
-
</a>
|
16 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/releases">
|
17 |
-
<img alt="GitHub release" src="https://img.shields.io/github/v/release/Sunwood-ai-labs/HarmonAI_III?include_prereleases&style=flat-square">
|
18 |
-
</a>
|
19 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/graphs/commit-activity">
|
20 |
-
<img alt="GitHub commit activity" src="https://img.shields.io/github/commit-activity/m/Sunwood-ai-labs/HarmonAI_III">
|
21 |
-
</a>
|
22 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/pulls">
|
23 |
-
<img alt="PRs Welcome" src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square">
|
24 |
-
</a>
|
25 |
-
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/Sunwood-ai-labs/HarmonAI_III">
|
26 |
-
<img alt="Development Status" src="https://img.shields.io/badge/status-active-success.svg">
|
27 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/issues">
|
28 |
-
<img alt="GitHub issues" src="https://img.shields.io/github/issues/Sunwood-ai-labs/HarmonAI_III">
|
29 |
-
</a>
|
30 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/network/members">
|
31 |
-
<img alt="GitHub forks" src="https://img.shields.io/github/forks/Sunwood-ai-labs/HarmonAI_III?style=social">
|
32 |
-
</a>
|
33 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/watchers">
|
34 |
-
<img alt="GitHub watchers" src="https://img.shields.io/github/watchers/Sunwood-ai-labs/HarmonAI_III?style=social">
|
35 |
-
</a>
|
36 |
-
<img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Sunwood-ai-labs/HarmonAI_III">
|
37 |
-
<img alt="GitHub top language" src="https://img.shields.io/github/languages/top/Sunwood-ai-labs/HarmonAI_III">
|
38 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/graphs/contributors">
|
39 |
-
<img alt="GitHub contributors" src="https://img.shields.io/github/contributors/Sunwood-ai-labs/HarmonAI_III">
|
40 |
-
</a>
|
41 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/issues?q=is%3Aissue+is%3Aclosed">
|
42 |
-
<img alt="GitHub closed issues" src="https://img.shields.io/github/issues-closed/Sunwood-ai-labs/HarmonAI_III">
|
43 |
-
</a>
|
44 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/pulls?q=is%3Apr+is%3Aclosed">
|
45 |
-
<img alt="GitHub closed PRs" src="https://img.shields.io/github/issues-pr-closed/Sunwood-ai-labs/HarmonAI_III">
|
46 |
-
</a>
|
47 |
-
<img alt="GitHub language count" src="https://img.shields.io/github/languages/count/Sunwood-ai-labs/HarmonAI_III">
|
48 |
-
<img alt="GitHub search hit counter" src="https://img.shields.io/github/search/Sunwood-ai-labs/HarmonAI_III/goto">
|
49 |
-
<img alt="GitHub code size" src="https://img.shields.io/github/languages/code-size/Sunwood-ai-labs/HarmonAI_III">
|
50 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/blob/main/CONTRIBUTING.md">
|
51 |
-
<img src="https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg" alt="Contributor Covenant">
|
52 |
-
</a>
|
53 |
-
<a href="https://twitter.com/intent/tweet?text=Check%20out%20this%20awesome%20project%3A&url=https%3A%2F%2Fgithub.com%2FSunwood-ai-labs%2FHarmonAI_III">
|
54 |
-
<img alt="Twitter" src="https://img.shields.io/twitter/url?style=social&url=https%3A%2F%2Fgithub.com%2FSunwood-ai-labs%2FHarmonAI_III">
|
55 |
-
</a>
|
56 |
-
<img alt="GitHub Created At" src="https://img.shields.io/github/created-at/Sunwood-ai-labs/HarmonAI_III">
|
57 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/deployments">
|
58 |
-
<img alt="GitHub deployments" src="https://img.shields.io/github/deployments/Sunwood-ai-labs/HarmonAI_III/Production">
|
59 |
-
</a>
|
60 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/discussions">
|
61 |
-
<img alt="GitHub Discussions" src="https://img.shields.io/github/discussions/Sunwood-ai-labs/HarmonAI_III">
|
62 |
-
</a>
|
63 |
-
<img alt="GitHub followers" src="https://img.shields.io/github/followers/Sunwood-ai-labs?style=social">
|
64 |
-
<img alt="GitHub Release Date" src="https://img.shields.io/github/release-date/Sunwood-ai-labs/HarmonAI_III">
|
65 |
-
<img alt="GitHub commit activity (branch)" src="https://img.shields.io/github/commit-activity/y/Sunwood-ai-labs/HarmonAI_III/main">
|
66 |
-
<img alt="GitHub commits since latest release (by date)" src="https://img.shields.io/github/commits-since/Sunwood-ai-labs/HarmonAI_III/latest">
|
67 |
-
|
68 |
-
|
69 |
-
</a>
|
70 |
-
</p>
|
71 |
-
|
72 |
-
<p align="center">
|
73 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/actions/workflows/generate-release-notes.yml">
|
74 |
-
<img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Sunwood-ai-labs/HarmonAI_III/generate-release-notes.yml?label=generate-auto-release-notes">
|
75 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/actions/workflows/translate-readme.yml">
|
76 |
-
<img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Sunwood-ai-labs/HarmonAI_III/generate-release-notes.yml?label=auto-translate-readme">
|
77 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/actions/workflows/issue-review.yml">
|
78 |
-
<img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Sunwood-ai-labs/HarmonAI_III/generate-release-notes.yml?label=auto-issue-review">
|
79 |
-
</p>
|
80 |
-
<h2 align="center">
|
81 |
-
~ AI-Powered Automated Repository Management Template ~
|
82 |
-
|
83 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/blob/main/README.md"><img src="https://img.shields.io/badge/ドキュメント-日本語-white.svg" alt="JA doc"/></a>
|
84 |
-
<a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/blob/main/docs/README.en.md"><img src="https://img.shields.io/badge/english-document-white.svg" alt="EN doc"></a>
|
85 |
-
</h2>
|
86 |
-
|
87 |
-
> [!IMPORTANT]
|
88 |
-
> HarmonAI IIIは、[cline (旧:Claude Dev)](https://github.com/clinebot/cline), [SourceSage](https://github.com/Sunwood-ai-labs/SourceSage), [claude.ai](https://claude.ai/)を活用して開発されたテンプレートリポジトリです。リリースノート、README、コミットメッセージの大部分は、最新のAI技術を用いて生成されています。
|
89 |
-
|
90 |
-
## 🚀 プロジェクト概要
|
91 |
-
|
92 |
-
HarmonAI IIIは、AIRAとIRISを統合した革新的な**AIリポジトリスターターキット**です。このリポジトリは、LLMを活用したAI開発プロジェクトの構造とワークフローを提供し、開発者の作業効率を劇的に向上させることを目的としています。バージョン: `v1.2.0`
|
93 |
-
|
94 |
-
|
95 |
-
## 🆕 最新情報
|
96 |
-
|
97 |
-
- 🎉 v1.2.0リリース: READMEへのGitHub Shieldsの追加、コラボレーター招待機能の追加、ドキュメントの更新を行いました。
|
98 |
-
|
99 |
-
|
100 |
-
## ✨ 主な機能
|
101 |
-
|
102 |
-
1. **統合AIツールセット**: AIRAとIRISの機能を1つのパッケージで提供
|
103 |
-
2. **即時利用可能**: テンプレートとして使用することで、高品質な初期構造を持つリポジトリを簡単に作成
|
104 |
-
3. **自動化された開発ワークフロー**: コミットメッセージ生成、リリースノート作成、イシュー管理の自動化
|
105 |
-
4. **多言語サポート**: READMEの自動翻訳機能により、国際的なプロジェクト展開をサポート
|
106 |
-
5. **柔軟なカスタマイズ**: プロジェクトのニーズに合わせて容易に調整可能
|
107 |
-
6. **コラボレーター自動招待**: GitHub APIを利用したコラボレーター招待スクリプト
|
108 |
-
|
109 |
-
|
110 |
-
## 🔧 使用方法
|
111 |
-
|
112 |
-
### AIRAの使用例:
|
113 |
-
```bash
|
114 |
-
aira --mode sourcesage commit --config=.aira\config.dev.commit.yml --ss-model-name="gpt-4o-mini" --llm-output="llm_output.md"
|
115 |
-
```
|
116 |
-
|
117 |
-
### IRISの使用例:
|
118 |
-
|
119 |
-
詳細な使用方法については、各コンポーネントのドキュメンテーションを参照してください。
|
120 |
-
|
121 |
-
|
122 |
-
## 📦 インストール手順
|
123 |
-
|
124 |
-
1. このリポジトリをテンプレートとして使用し、新しいリポジトリを作成します。
|
125 |
-
2. リポジトリをローカルにクローンします。
|
126 |
-
3. 必要な依存関係をインストールします:
|
127 |
-
```bash
|
128 |
-
pip install -r requirements.txt
|
129 |
-
```
|
130 |
-
4. AIRAとIRISの設定ファイルをカスタマイズします。
|
131 |
-
5. GitHub Actionsの設定を確認し、必要に応じて環境変数を設定します。
|
132 |
-
6. `.github/release_notes/.sourcesage_releasenotes_iris.yml`ファイルを開き、`repo-name:`の値を新しいリポジトリ名に修正します。
|
133 |
-
|
134 |
-
|
135 |
-
## 🌿 環境構築
|
136 |
-
|
137 |
-
HarmonAI IIIの環境を構築するには、以下の手順に従ってください:
|
138 |
-
|
139 |
-
1. 仮想環境を作成します:
|
140 |
-
```bash
|
141 |
-
python3 -m venv .venv
|
142 |
-
```
|
143 |
-
これにより、`.venv`ディレクトリに仮想環境が作成されます。
|
144 |
-
|
145 |
-
2. 仮想環境をアクティベートします:
|
146 |
-
```bash
|
147 |
-
source .venv/bin/activate # Linux/macOS
|
148 |
-
.venv\Scripts\activate # Windows
|
149 |
-
```
|
150 |
-
|
151 |
-
3. 依存関係をインストールします:
|
152 |
-
```bash
|
153 |
-
pip install -r requirements.txt
|
154 |
-
```
|
155 |
-
|
156 |
-
これらの手順により、HarmonAI IIIの開発環境が整います。
|
157 |
-
|
158 |
-
|
159 |
-
## 📚 主要コンポーネント
|
160 |
|
161 |
-
|
162 |
-
- リポジトリ作成の自動化
|
163 |
-
- コミットメッセージの自動生成
|
164 |
|
165 |
-
|
166 |
-
- イシューの自動分類
|
167 |
-
- 解決策の自動提案
|
168 |
-
- リリースノートの自���生成
|
169 |
-
- READMEの自動翻訳
|
170 |
|
171 |
-
|
|
|
|
|
172 |
|
173 |
-
|
174 |
|
175 |
-
1.
|
176 |
-
```
|
177 |
-
# GitHubアクセストークン(コラボレーター招待用)
|
178 |
-
GITHUB_TOKEN=your_github_personal_access_token_here
|
179 |
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
```
|
185 |
-
|
186 |
-
注意: `.env` ファイルは `.gitignore` に含めて、リポジトリにコミットしないようにしてください。
|
187 |
-
|
188 |
-
2. 以下のコマンドを実行してコラボレーターを招待します:
|
189 |
-
```bash
|
190 |
-
python .github/github_add_collaborator.py Sunwood-ai-labs/HarmonAI_III username_to_invite
|
191 |
-
```
|
192 |
-
|
193 |
-
`username_to_invite` は招待したいGitHubユーザー名に置き換えてください。
|
194 |
-
|
195 |
-
3. スクリプトが正常に実行されると、指定したユーザーにコラボレーター招待が送信されます。
|
196 |
-
|
197 |
-
注意事項:
|
198 |
-
- このスクリプトを使用するには、GitHubトークンに適切な権限(`repo` スコープ)が必要です。
|
199 |
-
- 組織のリポジトリに対して使用する場合は、組織の設定で適切な権限が付与されていることを確認してください。
|
200 |
-
- セキュリティのため、トークンは定期的に更新し、必要最小限の権限のみを付与するようにしてください。
|
201 |
-
- `.env` ファイルやトークンを含む情報は、決して公開リポジトリにコミットしないでください。
|
202 |
-
|
203 |
-
この機能により、プロジェクトへの新しいコントリビューターの追加プロセスが簡素化されます。セキュリティを維持しながら、効率的にチームを拡大することができます。
|
204 |
-
|
205 |
-
## 🐈 処理フロー
|
206 |
|
|
|
207 |
|
208 |
-
```
|
209 |
-
|
|
|
210 |
|
211 |
-
|
212 |
-
A[開始] --> B[リポジトリの構想とネーミング]
|
213 |
-
B -->|人間が実施| C[HarmonAI IIIによる<br>リポジトリ初期化]
|
214 |
-
C -->|自動化| D[開発作業]
|
215 |
-
D -->|人間が実施| E[AIRAによる<br>コミット自動化]
|
216 |
-
E --> H[IRISによる<br>リリースノート作成]
|
217 |
-
H --> I[IRISによる<br>ドキュメント翻訳]
|
218 |
-
I --> J[リリース]
|
219 |
-
J --> K[終了]
|
220 |
|
221 |
-
|
222 |
-
class E aira;
|
223 |
-
class F,H,I iris;
|
224 |
-
class C auto;
|
225 |
-
class A,J,K process;
|
226 |
|
|
|
|
|
227 |
```
|
228 |
|
|
|
229 |
|
|
|
230 |
|
231 |
-
|
232 |
-
|
233 |
-
HarmonAI IIIは、オープンソースプロジェクトとしてコミュニティからの貢献を歓迎しています。バグ報告、機能リクエスト、プルリクエストを通じて、このテンプレートリポジトリの改善にご協力ください。
|
234 |
-
|
235 |
-
## 📄 ライセンス
|
236 |
|
237 |
-
|
238 |
|
239 |
-
##
|
240 |
|
241 |
-
|
|
|
242 |
|
243 |
-
|
244 |
|
245 |
-
|
|
|
1 |
+
# Pic-to-Header
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
3 |
+
Pic-to-Headerは、マスク画像と入力画像を使用してヘッダー画像を生成するPythonアプリケーションです。
|
|
|
|
|
4 |
|
5 |
+
## 機能
|
|
|
|
|
|
|
|
|
6 |
|
7 |
+
- マスク画像と入力画像をアップロード
|
8 |
+
- 入力画像にマスクを適用してヘッダー画像を生成
|
9 |
+
- 生成されたヘッダー画像のプレビューとダウンロード
|
10 |
|
11 |
+
## インストール
|
12 |
|
13 |
+
1. リポジトリをクローンします:
|
|
|
|
|
|
|
14 |
|
15 |
+
```
|
16 |
+
git clone https://github.com/yourusername/pic-to-header.git
|
17 |
+
cd pic-to-header
|
18 |
+
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
|
20 |
+
2. 必要な依存関係をインストールします:
|
21 |
|
22 |
+
```
|
23 |
+
pip install -r requirements.txt
|
24 |
+
```
|
25 |
|
26 |
+
## 使用方法
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
|
28 |
+
1. Streamlitアプリケーションを起動します:
|
|
|
|
|
|
|
|
|
29 |
|
30 |
+
```
|
31 |
+
streamlit run web_app/app.py
|
32 |
```
|
33 |
|
34 |
+
2. ブラウザで表示されるURLにアクセスします。
|
35 |
|
36 |
+
3. 入力画像とマスク画像をアップロードします。
|
37 |
|
38 |
+
4. "ヘッダー画像を生成"ボタンをクリックします。
|
|
|
|
|
|
|
|
|
39 |
|
40 |
+
5. 生成されたヘッダー画像をプレビューし、必要に応じてダウンロードします。
|
41 |
|
42 |
+
## 開発
|
43 |
|
44 |
+
- `pic_to_header/core.py`: 画像処理の主要な機能を含みます。
|
45 |
+
- `web_app/app.py`: Streamlitを使用したWebインターフェースを提供します。
|
46 |
|
47 |
+
## ライセンス
|
48 |
|
49 |
+
このプロジェクトはMITライセンスの下で公開されています。詳細については、[LICENSE](LICENSE)ファイルを参照してください。
|
pic_to_header/__init__.py
ADDED
File without changes
|
pic_to_header/core.py
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import cv2
|
2 |
+
import numpy as np
|
3 |
+
|
4 |
+
def process_header_image(input_image_path, mask_image_path, output_image_path):
|
5 |
+
# 入力画像を読み込む
|
6 |
+
input_image = cv2.imread(input_image_path, cv2.IMREAD_UNCHANGED)
|
7 |
+
|
8 |
+
# マスク画像を読み込み、グレースケールに変換
|
9 |
+
mask_image = cv2.imread(mask_image_path, cv2.IMREAD_GRAYSCALE)
|
10 |
+
|
11 |
+
# マスク画像を入力画像と同じサイズにリサイズ
|
12 |
+
mask_image = cv2.resize(mask_image, (input_image.shape[1], input_image.shape[0]))
|
13 |
+
|
14 |
+
# 入力画像にアルファチャンネルがない場合は追加
|
15 |
+
if input_image.shape[2] == 3:
|
16 |
+
input_image = cv2.cvtColor(input_image, cv2.COLOR_BGR2BGRA)
|
17 |
+
|
18 |
+
# マスクを適用
|
19 |
+
input_image[:, :, 3] = mask_image
|
20 |
+
|
21 |
+
# 結果を保存
|
22 |
+
cv2.imwrite(output_image_path, input_image)
|
23 |
+
|
24 |
+
return output_image_path
|
requirements.txt
CHANGED
@@ -1,2 +1,3 @@
|
|
1 |
-
|
2 |
-
|
|
|
|
1 |
+
opencv-python==4.5.5.64
|
2 |
+
numpy==1.21.5
|
3 |
+
streamlit==1.10.0
|
tests/__init__.py
ADDED
File without changes
|
tests/test_core.py
ADDED
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import unittest
|
2 |
+
import os
|
3 |
+
import cv2
|
4 |
+
import numpy as np
|
5 |
+
from pic_to_header.core import process_header_image
|
6 |
+
|
7 |
+
class TestCore(unittest.TestCase):
|
8 |
+
def setUp(self):
|
9 |
+
self.input_image_path = 'test_input.png'
|
10 |
+
self.mask_image_path = 'test_mask.png'
|
11 |
+
self.output_image_path = 'test_output.png'
|
12 |
+
|
13 |
+
# テスト用の入力画像を作成
|
14 |
+
input_image = np.ones((100, 100, 3), dtype=np.uint8) * 255
|
15 |
+
cv2.imwrite(self.input_image_path, input_image)
|
16 |
+
|
17 |
+
# テスト用のマスク画像を作成
|
18 |
+
mask_image = np.zeros((100, 100), dtype=np.uint8)
|
19 |
+
mask_image[25:75, 25:75] = 255
|
20 |
+
cv2.imwrite(self.mask_image_path, mask_image)
|
21 |
+
|
22 |
+
def tearDown(self):
|
23 |
+
# テスト用のファイルを削除
|
24 |
+
for file in [self.input_image_path, self.mask_image_path, self.output_image_path]:
|
25 |
+
if os.path.exists(file):
|
26 |
+
os.remove(file)
|
27 |
+
|
28 |
+
def test_process_header_image(self):
|
29 |
+
# process_header_image 関数をテスト
|
30 |
+
result = process_header_image(self.input_image_path, self.mask_image_path, self.output_image_path)
|
31 |
+
|
32 |
+
# 出力ファイルが作成されたことを確認
|
33 |
+
self.assertTrue(os.path.exists(self.output_image_path))
|
34 |
+
|
35 |
+
# 出力画像を読み込み
|
36 |
+
output_image = cv2.imread(self.output_image_path, cv2.IMREAD_UNCHANGED)
|
37 |
+
|
38 |
+
# 出力画像が正しいサイズであることを確認
|
39 |
+
self.assertEqual(output_image.shape[:2], (100, 100))
|
40 |
+
|
41 |
+
# アルファチャンネルが正しく適用されていることを確認
|
42 |
+
self.assertEqual(output_image.shape[2], 4) # BGRAチャンネル
|
43 |
+
|
44 |
+
# マスクが正しく適用されていることを確認
|
45 |
+
np.testing.assert_array_equal(output_image[25:75, 25:75, 3], 255)
|
46 |
+
np.testing.assert_array_equal(output_image[:25, :, 3], 0)
|
47 |
+
np.testing.assert_array_equal(output_image[75:, :, 3], 0)
|
48 |
+
np.testing.assert_array_equal(output_image[:, :25, 3], 0)
|
49 |
+
np.testing.assert_array_equal(output_image[:, 75:, 3], 0)
|
50 |
+
|
51 |
+
if __name__ == '__main__':
|
52 |
+
unittest.main()
|
web_app/__init__.py
ADDED
File without changes
|
web_app/app.py
ADDED
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import os
|
3 |
+
from pic_to_header.core import process_header_image
|
4 |
+
|
5 |
+
def main():
|
6 |
+
st.title("Pic-to-Header")
|
7 |
+
st.write("マスク画像と入力画像をアップロードして、ヘッダー画像を生成します。")
|
8 |
+
|
9 |
+
input_image = st.file_uploader("入力画像をアップロード", type=["png", "jpg", "jpeg"])
|
10 |
+
mask_image = st.file_uploader("マスク画像をアップロード", type=["png", "jpg", "jpeg"])
|
11 |
+
|
12 |
+
if input_image is not None and mask_image is not None:
|
13 |
+
if st.button("ヘッダー画像を生成"):
|
14 |
+
# 一時ファイルとして保存
|
15 |
+
input_path = f"temp_input.{input_image.name.split('.')[-1]}"
|
16 |
+
mask_path = f"temp_mask.{mask_image.name.split('.')[-1]}"
|
17 |
+
output_path = "output_header.png"
|
18 |
+
|
19 |
+
with open(input_path, "wb") as f:
|
20 |
+
f.write(input_image.getbuffer())
|
21 |
+
with open(mask_path, "wb") as f:
|
22 |
+
f.write(mask_image.getbuffer())
|
23 |
+
|
24 |
+
# 画像処理
|
25 |
+
process_header_image(input_path, mask_path, output_path)
|
26 |
+
|
27 |
+
# 結果を表示
|
28 |
+
st.image(output_path, caption="生成されたヘッダー画像")
|
29 |
+
|
30 |
+
# ダウンロードボタンを追加
|
31 |
+
with open(output_path, "rb") as file:
|
32 |
+
btn = st.download_button(
|
33 |
+
label="ヘッダー画像をダウンロード",
|
34 |
+
data=file,
|
35 |
+
file_name="header_image.png",
|
36 |
+
mime="image/png"
|
37 |
+
)
|
38 |
+
|
39 |
+
# 一時ファイルを削除
|
40 |
+
os.remove(input_path)
|
41 |
+
os.remove(mask_path)
|
42 |
+
os.remove(output_path)
|
43 |
+
|
44 |
+
if __name__ == "__main__":
|
45 |
+
main()
|