Spaces:
Sleeping
Sleeping
🐞 fix & ✨ feat: ヘッダー画像生成処理の改善とエラー処理、ログ出力機能の追加
Browse files- アルファチャンネルの処理を改善し、マスク画像の適用方法をより正確にしました。
- 入力画像とマスク画像の存在チェックを追加し、エラー時のログ出力を行うようにしました。
- `loguru`ライブラリを追加し、処理過程のログをファイルに出力するようにしました。
- コマンドライン引数による入力、マスク、出力画像パスの指定を可能にしました。
- 処理開始、完了、エラー発生時のログを記録するよう改善しました。
- マスク画像のアルファチャンネルを考慮した減算処理に変更しました。
- マスク画像と入力画像のサイズが異なる場合の処理を追加する必要があります。(今後の課題)
- ログ出力の設定を追加しました。
- pic_to_header/core.py +43 -4
pic_to_header/core.py
CHANGED
@@ -1,24 +1,63 @@
|
|
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.
|
|
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
|
21 |
# 結果を保存
|
22 |
cv2.imwrite(output_image_path, input_image)
|
|
|
23 |
|
24 |
return output_image_path
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
import cv2
|
2 |
import numpy as np
|
3 |
+
import argparse
|
4 |
+
import os
|
5 |
+
from loguru import logger
|
6 |
|
7 |
def process_header_image(input_image_path, mask_image_path, output_image_path):
|
8 |
+
logger.info(f"処理を開始します: 入力画像={input_image_path}, マスク画像={mask_image_path}")
|
9 |
+
|
10 |
# 入力画像を読み込む
|
11 |
input_image = cv2.imread(input_image_path, cv2.IMREAD_UNCHANGED)
|
12 |
+
logger.info(f"入力画像のサイズ: {input_image.shape}")
|
13 |
|
14 |
+
# マスク画像を読み込む(グレースケールではなく、アルファチャンネル付きで)
|
15 |
+
mask_image = cv2.imread(mask_image_path, cv2.IMREAD_UNCHANGED)
|
16 |
+
logger.info(f"マスク画像のサイズ: {mask_image.shape}")
|
17 |
|
18 |
# マスク画像を入力画像と同じサイズにリサイズ
|
19 |
mask_image = cv2.resize(mask_image, (input_image.shape[1], input_image.shape[0]))
|
20 |
+
logger.info(f"リサイズ後のマスク画像のサイズ: {mask_image.shape}")
|
21 |
|
22 |
# 入力画像にアルファチャンネルがない場合は追加
|
23 |
if input_image.shape[2] == 3:
|
24 |
+
logger.info("入力画像にアルファチャンネルを追加します")
|
25 |
input_image = cv2.cvtColor(input_image, cv2.COLOR_BGR2BGRA)
|
26 |
|
27 |
+
# マスク画像にアルファチャンネルがない場合は追加
|
28 |
+
if mask_image.shape[2] == 3:
|
29 |
+
logger.info("マスク画像にアルファチャンネルを追加します")
|
30 |
+
mask_image = cv2.cvtColor(mask_image, cv2.COLOR_BGR2BGRA)
|
31 |
+
|
32 |
+
# マスク画像のアルファチャンネルを取得
|
33 |
+
mask_alpha = mask_image[:, :, 3]
|
34 |
+
|
35 |
+
# 入力画像のアルファチャンネルを更新
|
36 |
+
# マスクのアルファ値を使って元の画像のアルファ値を減算
|
37 |
+
input_image[:, :, 3] = np.maximum(input_image[:, :, 3] - mask_alpha, 0)
|
38 |
|
39 |
# 結果を保存
|
40 |
cv2.imwrite(output_image_path, input_image)
|
41 |
+
logger.info(f"処理が完了しました。出力画像: {output_image_path}")
|
42 |
|
43 |
return output_image_path
|
44 |
+
|
45 |
+
if __name__ == "__main__":
|
46 |
+
logger.add("process.log", rotation="1 MB") # ログファイルの設定
|
47 |
+
|
48 |
+
parser = argparse.ArgumentParser(description='画像にマスクを適用してヘッダー画像を生成します。')
|
49 |
+
parser.add_argument('input_image', help='入力画像のパス')
|
50 |
+
parser.add_argument('mask_image', help='マスク画像のパス')
|
51 |
+
parser.add_argument('output_image', help='出力画像のパス')
|
52 |
+
args = parser.parse_args()
|
53 |
+
|
54 |
+
if not os.path.exists(args.input_image):
|
55 |
+
logger.error(f"エラー: 入力画像が見つかりません: {args.input_image}")
|
56 |
+
elif not os.path.exists(args.mask_image):
|
57 |
+
logger.error(f"エラー: マスク画像が見つかりません: {args.mask_image}")
|
58 |
+
else:
|
59 |
+
try:
|
60 |
+
result = process_header_image(args.input_image, args.mask_image, args.output_image)
|
61 |
+
logger.success(f"処理が成功しました。結果: {result}")
|
62 |
+
except Exception as e:
|
63 |
+
logger.exception(f"エラーが発生しました: {str(e)}")
|