Files
kenaito-media-picker/internal/classify/brightness.go
T
odboy 13bb195e1d refactor(classify): 重构图片明暗分类逻辑
- 移除固定的明暗阈值等级数组,改用动态分档机制
- 引入 neutralMargin 常量,当两分差幅小于 0.15 时视为中性图
- 修改 BrightnessName 函数,实现三分法分类:bright_N、dark_N、mid
- 新增 brightnessTier 辅助函数,将占比分档到最接近的 10%
- 完全透明的像素(alpha=0)不再参与明暗统计计算
- 更新错误提示信息,明暗分析失败时按中性 mid 归类
- 调整 README 文档描述,同步更新明暗分类规则说明
2025-04-01 21:07:48 +08:00

34 lines
1.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package classify
import "fmt"
// neutralMargin 判定明暗主导的最小分差:两分差幅小于该值视为中性图
const neutralMargin = 0.15
// BrightnessName 判定图片明暗等级,返回如 "dark_70" / "bright_40" / "mid"。
// 以主导分差幅判定亮暗:lightScore 高于 darkScore neutralMargin 以上归 bright,
// 反之归 dark,两者接近视为中性 mid(不再强制二选一)。
func BrightnessName(darkScore, lightScore float64) string {
switch {
case lightScore > darkScore+neutralMargin:
return fmt.Sprintf("bright_%d", brightnessTier(lightScore))
case darkScore > lightScore+neutralMargin:
return fmt.Sprintf("dark_%d", brightnessTier(darkScore))
default:
return "mid"
}
}
// brightnessTier 将占比分档到最接近的 10%,表示命中区间 [N-5%, N+5%),最小 10、最大 100。
// 例如 0.30~0.39 归 "30",0.96 以上归 "100",避免占比不足却挂高档名。
func brightnessTier(score float64) int {
tier := int(score*100+5) / 10 * 10
if tier < 10 {
return 10
}
if tier > 100 {
return 100
}
return tier
}