GH/utils/photo_advice_generator.py

366 lines
14 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""
照片评分建议生成器
为照片评分结果提供具体的改进建议
"""
class PhotoAdviceGenerator:
"""照片建议生成器类"""
def __init__(self):
self.quality_advice_db = self._init_quality_advice()
self.aesthetic_advice_db = self._init_aesthetic_advice()
self.technical_advice_db = self._init_technical_advice()
def _init_quality_advice(self):
"""初始化质量改进建议数据库"""
return {
'clarity': {
'low': [
"使用三脚架或稳定设备减少抖动",
"提高快门速度避免运动模糊",
"使用自动对焦确保主体清晰",
"清洁镜头避免污渍影响",
"在光线充足的环境下拍摄"
],
'medium': [
"微调对焦点确保主体清晰",
"使用更高的分辨率设置",
"避免过度压缩图像",
"后期适当锐化处理"
],
'high': [
"清晰度优秀,继续保持",
"可尝试更高难度的拍摄场景"
]
},
'brightness': {
'low': [
"增加曝光补偿",
"使用闪光灯或补光设备",
"选择光线更好的拍摄时间",
"提高ISO感光度注意噪点",
"使用反光板补光"
],
'medium': [
"微调曝光参数",
"使用HDR模式拍摄",
"注意高光和阴影的平衡",
"后期调整亮度曲线"
],
'high': [
"亮度适中,曝光准确",
"可尝试创意光影效果"
]
},
'contrast': {
'low': [
"增加画面明暗对比",
"选择色彩对比强烈的场景",
"使用侧光或逆光增强立体感",
"后期调整对比度参数"
],
'medium': [
"适当增强局部对比",
"注意高光不过曝,阴影不死黑",
"使用曲线工具精细调整"
],
'high': [
"对比度良好,层次分明",
"可尝试高对比风格创作"
]
},
'color_balance': {
'low': [
"校正白平衡设置",
"使用灰卡进行色彩校准",
"避免混合光源造成的色偏",
"后期校正色彩平衡"
],
'medium': [
"微调色温和色调",
"注意肤色还原自然",
"统一画面色彩风格"
],
'high': [
"色彩平衡优秀,还原准确",
"可尝试创意色彩风格"
]
}
}
def _init_aesthetic_advice(self):
"""初始化美学改进建议数据库"""
return {
'composition': {
'basic': [
"学习三分法则构图",
"注意主体在画面中的位置",
"避免主体过于居中",
"利用引导线增强画面深度"
],
'intermediate': [
"尝试对称或不对称构图",
"利用前景增强层次感",
"注意画面元素的平衡",
"创造视觉焦点"
],
'advanced': [
"构图优秀,可尝试更复杂构图",
"探索极简或复杂构图风格",
"注重画面节奏和韵律"
]
},
'lighting': {
'basic': [
"选择黄金时刻拍摄(日出日落)",
"避免正午强光直射",
"学习使用自然光",
"注意光影方向和质量"
],
'intermediate': [
"尝试侧光或逆光效果",
"利用阴影创造氛围",
"控制光比避免过曝或欠曝",
"学习使用人造光源"
],
'advanced': [
"光线运用娴熟,可尝试创意用光",
"探索特殊光线条件拍摄",
"注重光影的情感表达"
]
},
'subject': {
'basic': [
"明确拍摄主体",
"简化背景突出主体",
"注意主体与环境的互动",
"选择有故事性的主体"
],
'intermediate': [
"注重主体的表情和姿态",
"创造主体与环境的关系",
"捕捉决定性瞬间",
"注重主体的个性表达"
],
'advanced': [
"主体表现力强,可尝试更深层次表达",
"探索抽象或概念性主体",
"注重主体的象征意义"
]
}
}
def _init_technical_advice(self):
"""初始化技术改进建议数据库"""
return {
'camera_settings': [
"学习曝光三角关系光圈、快门、ISO",
"根据场景选择合适的拍摄模式",
"掌握对焦技巧确保主体清晰",
"合理使用白平衡设置"
],
'post_processing': [
"学习基本的后期调整技巧",
"掌握色彩校正和调整",
"学习锐化和降噪处理",
"尝试创意滤镜效果"
],
'equipment': [
"根据需求选择合适的镜头",
"考虑使用三脚架提高稳定性",
"投资质量好的存储设备",
"定期清洁和维护设备"
],
'shooting_techniques': [
"练习稳定的持机姿势",
"学习不同的拍摄角度",
"掌握连拍和定时拍摄",
"尝试慢门或高速摄影"
]
}
def generate_quality_advice(self, quality_scores):
"""生成质量改进建议"""
advice = {
'overall': [],
'specific': {},
'priority': []
}
# 总体建议
overall_score = sum(quality_scores.values()) / len(quality_scores)
if overall_score >= 90:
advice['overall'].append("照片质量优秀,继续保持高水平拍摄")
elif overall_score >= 80:
advice['overall'].append("照片质量良好,有进一步提升空间")
elif overall_score >= 60:
advice['overall'].append("照片质量一般,需要重点改进")
else:
advice['overall'].append("照片质量较差,建议系统学习摄影基础")
# 具体维度建议
for dimension, score in quality_scores.items():
if dimension in self.quality_advice_db:
level = self._get_score_level(score)
dimension_advice = self.quality_advice_db[dimension].get(level, [])
advice['specific'][dimension] = dimension_advice
# 添加优先级建议
if score < 70:
advice['priority'].append(f"优先改进{dimension}(当前{score}分)")
return advice
def generate_aesthetic_advice(self, aesthetic_score, composition_analysis):
"""生成美学改进建议"""
advice = {
'general': [],
'composition': [],
'lighting': [],
'subject': [],
'creative': []
}
# 总体美学建议
if aesthetic_score >= 90:
advice['general'].append("美学表现优秀,具备专业水准")
advice['creative'].append("可尝试更具挑战性的创意拍摄")
elif aesthetic_score >= 80:
advice['general'].append("美学表现良好,细节有待提升")
advice['creative'].append("尝试不同的构图和用光方式")
elif aesthetic_score >= 60:
advice['general'].append("美学表现一般,需要系统学习")
advice['creative'].append("从基础构图和用光开始练习")
else:
advice['general'].append("美学表现较差,建议学习摄影美学基础")
# 构图建议
comp_level = self._get_aesthetic_level(aesthetic_score)
advice['composition'] = self.aesthetic_advice_db['composition'].get(comp_level, [])
# 用光建议
light_level = self._get_aesthetic_level(aesthetic_score)
advice['lighting'] = self.aesthetic_advice_db['lighting'].get(light_level, [])
# 主体建议
subject_level = self._get_aesthetic_level(aesthetic_score)
advice['subject'] = self.aesthetic_advice_db['subject'].get(subject_level, [])
return advice
def generate_technical_advice(self, photo_type='general'):
"""生成技术改进建议"""
advice = {
'camera_settings': self.technical_advice_db['camera_settings'],
'post_processing': self.technical_advice_db['post_processing'],
'equipment': self.technical_advice_db['equipment'],
'shooting_techniques': self.technical_advice_db['shooting_techniques']
}
# 根据照片类型调整建议
if photo_type == 'portrait':
advice['camera_settings'].extend([
"使用大光圈虚化背景",
"注意对焦在眼睛上",
"使用柔光设备美化肤色"
])
elif photo_type == 'landscape':
advice['camera_settings'].extend([
"使用小光圈获得大景深",
"使用三脚架确保稳定性",
"利用滤镜控制光线"
])
elif photo_type == 'macro':
advice['camera_settings'].extend([
"使用微距镜头或近摄环",
"注意景深控制",
"使用环形闪光灯补光"
])
return advice
def generate_personalized_advice(self, quality_scores, aesthetic_score, photo_content):
"""生成个性化综合建议"""
personalized = {
'quick_wins': [],
'long_term_improvements': [],
'learning_resources': [],
'practice_exercises': []
}
# 快速改进建议
low_score_dimensions = [dim for dim, score in quality_scores.items() if score < 70]
if low_score_dimensions:
personalized['quick_wins'].append(f"重点改进:{', '.join(low_score_dimensions)}")
# 长期改进建议
if aesthetic_score < 80:
personalized['long_term_improvements'].append("系统学习摄影构图和用光")
# 学习资源推荐
personalized['learning_resources'].extend([
"推荐书籍:《摄影构图学》、《美国纽约摄影学院教材》",
"在线课程B站摄影教程、摄影之友",
"实践平台:参加摄影比赛、加入摄影社群"
])
# 练习建议
personalized['practice_exercises'].extend([
"每日拍摄练习:同一主题不同角度",
"技术练习:曝光、对焦、白平衡",
"创意练习:尝试不同风格和主题"
])
return personalized
def _get_score_level(self, score):
"""根据分数获取等级"""
if score >= 85:
return 'high'
elif score >= 70:
return 'medium'
else:
return 'low'
def _get_aesthetic_level(self, score):
"""根据美学分数获取等级"""
if score >= 85:
return 'advanced'
elif score >= 70:
return 'intermediate'
else:
return 'basic'
def get_quality_improvement_advice(quality_scores):
"""获取质量改进建议"""
try:
advisor = PhotoAdviceGenerator()
return advisor.generate_quality_advice(quality_scores)
except Exception as e:
return {'error': f"生成建议失败: {str(e)}"}
def get_aesthetic_improvement_advice(aesthetic_score, composition_analysis=None):
"""获取美学改进建议"""
try:
advisor = PhotoAdviceGenerator()
return advisor.generate_aesthetic_advice(aesthetic_score, composition_analysis)
except Exception as e:
return {'error': f"生成建议失败: {str(e)}"}
def get_technical_advice(photo_type='general'):
"""获取技术改进建议"""
try:
advisor = PhotoAdviceGenerator()
return advisor.generate_technical_advice(photo_type)
except Exception as e:
return {'error': f"生成建议失败: {str(e)}"}
def get_personalized_advice(quality_scores, aesthetic_score, photo_content):
"""获取个性化综合建议"""
try:
advisor = PhotoAdviceGenerator()
return advisor.generate_personalized_advice(quality_scores, aesthetic_score, photo_content)
except Exception as e:
return {'error': f"生成建议失败: {str(e)}"}