TravelContentCreator/examples/test_image_variations.py

143 lines
6.0 KiB
Python
Raw Normal View History

2025-04-26 15:53:44 +08:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import logging
import argparse
from pathlib import Path
from PIL import Image
# 添加项目根目录到路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from utils.poster_notes_creator import PosterNotesCreator
from utils.output_handler import FileSystemOutputHandler
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
def main():
parser = argparse.ArgumentParser(description='测试图像变化效果')
parser.add_argument('--input_image', type=str, required=True, help='输入图像路径')
parser.add_argument('--output_dir', type=str, default='./output/image_variations', help='输出目录')
parser.add_argument('--variations', type=int, default=5, help='要生成的变体数量')
parser.add_argument('--strength', type=str, default='medium', choices=['low', 'medium', 'high'],
help='变化强度: low(低), medium(中), high(高)')
parser.add_argument('--aspect_ratio', type=str, default='3:4', help='目标宽高比,格式如"3:4"')
parser.add_argument('--extra_effects', action='store_true', default=True,
help='是否应用额外效果(噪点、锐化等)')
args = parser.parse_args()
# 解析宽高比
try:
aspect_parts = args.aspect_ratio.split(':')
if len(aspect_parts) != 2:
raise ValueError("宽高比格式无效")
target_ratio = (int(aspect_parts[0]), int(aspect_parts[1]))
except Exception as e:
logger.error(f"解析宽高比时出错: {e}")
logger.info("使用默认宽高比 3:4")
target_ratio = (3, 4)
# 检查输入图像
if not os.path.exists(args.input_image) or not os.path.isfile(args.input_image):
logger.error(f"输入图像不存在: {args.input_image}")
return 1
# 创建输出目录
os.makedirs(args.output_dir, exist_ok=True)
# 加载输入图像
try:
original_image = Image.open(args.input_image)
logger.info(f"已加载图像: {args.input_image}, 尺寸: {original_image.size}")
except Exception as e:
logger.error(f"加载图像时出错: {e}")
return 1
# 初始化处理器
output_handler = FileSystemOutputHandler(os.path.dirname(args.output_dir))
creator = PosterNotesCreator(output_handler)
# 保存原始图像信息
width, height = original_image.size
aspect = width / height
logger.info(f"原始图像宽高比: {aspect:.4f} ({width}x{height})")
# 先保存原始图像,调整为目标比例但不添加变化
try:
original_processed = creator.process_image_to_aspect_ratio(
original_image,
target_ratio,
add_variation=False
)
original_output_path = os.path.join(args.output_dir, "original_processed.jpg")
original_processed.save(original_output_path)
processed_width, processed_height = original_processed.size
logger.info(f"已保存原始处理图像(无变化): {original_output_path}")
logger.info(f"处理后尺寸: {processed_width}x{processed_height}, 宽高比: {processed_width/processed_height:.4f}")
except Exception as e:
logger.error(f"处理原始图像时出错: {e}")
# 生成多个变体
logger.info(f"开始生成 {args.variations} 个图像变体(强度: {args.strength}, 额外效果: {'开启' if args.extra_effects else '关闭'}...")
for i in range(args.variations):
try:
# 处理图像并添加变化
varied_image = creator.process_image_to_aspect_ratio(
original_image,
target_ratio,
add_variation=True,
seed=i+1, # 使用不同的种子
variation_strength=args.strength,
extra_effects=args.extra_effects
)
# 保存变体
output_path = os.path.join(args.output_dir, f"variation_{i+1}_{args.strength}.jpg")
varied_image.save(output_path)
logger.info(f"已保存变体 {i+1}: {output_path}")
except Exception as e:
logger.error(f"生成变体 {i+1} 时出错: {e}")
# 如果有额外效果,也生成一组无额外效果的变体来对比
if args.extra_effects and args.strength != 'low':
logger.info("生成无额外效果的变体用于对比...")
for i in range(min(3, args.variations)): # 只生成少量用于对比
try:
varied_image = creator.process_image_to_aspect_ratio(
original_image,
target_ratio,
add_variation=True,
seed=i+100, # 使用不同的种子
variation_strength=args.strength,
extra_effects=False # 关闭额外效果
)
output_path = os.path.join(args.output_dir, f"no_extra_effects_{i+1}.jpg")
varied_image.save(output_path)
logger.info(f"已保存无额外效果变体 {i+1}: {output_path}")
except Exception as e:
logger.error(f"生成无额外效果变体 {i+1} 时出错: {e}")
logger.info(f"图像变体生成完成。所有图像都保存在: {args.output_dir}")
# 列出各种配置对照
logger.info("\n图像变化配置参考:")
logger.info("- 低强度变化: 亮度/对比度/饱和度 ±3%, 最大旋转 ±0.5°")
logger.info("- 中强度变化: 亮度/对比度/饱和度 ±5%, 最大旋转 ±1.0°")
logger.info("- 高强度变化: 亮度/对比度/饱和度 ±8%, 最大旋转 ±2.0°")
logger.info("- 额外效果包括: 微弱噪点, 色相调整, 边缘处理, 锐化/模糊")
return 0
if __name__ == "__main__":
sys.exit(main())