修正色调排序

This commit is contained in:
2024-11-15 11:58:54 +08:00
parent bddb184c78
commit cc5471284e
2 changed files with 41 additions and 7 deletions

View File

@@ -7,6 +7,7 @@ import (
"os" "os"
"reflect" "reflect"
"regexp" "regexp"
"sort"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@@ -141,14 +142,41 @@ func NewSchema(config Config) (graphql.Schema, error) {
continue continue
} }
centers, _ := KMeans(extractColors(img), 8) k := 8
centers, labels := KMeans(extractColors(img), k)
// 将聚类中心和颜色数量结合,并按颜色数量降序排序
type cluster struct {
center RGB
count int
}
clusters := make([]cluster, k)
for i := 0; i < k; i++ {
clusters[i] = cluster{center: centers[i], count: 0}
}
// 统计每个聚类的颜色数量
for _, label := range labels {
clusters[label].count++
}
// 按颜色数量降序排序
sort.Slice(clusters, func(i, j int) bool {
return clusters[i].count > clusters[j].count
})
// 返回排序后的聚类中心
sortedCenters := make([]RGB, k)
for i, c := range clusters {
sortedCenters[i] = c.center
}
fmt.Println("聚类后的颜色数量:", clusters)
if err := db.Table("web_images").Where("id = ?", item.ID).Updates(map[string]interface{}{ if err := db.Table("web_images").Where("id = ?", item.ID).Updates(map[string]interface{}{
"color_0_r": centers[0].R, "color_0_r": sortedCenters[0].R,
"color_0_g": centers[0].G, "color_0_g": sortedCenters[0].G,
"color_0_b": centers[0].B, "color_0_b": sortedCenters[0].B,
"color_1_r": centers[1].R, "color_1_r": sortedCenters[1].R,
"color_1_g": centers[1].G, "color_1_g": sortedCenters[1].G,
"color_1_b": centers[1].B, "color_1_b": sortedCenters[1].B,
}).Error; err != nil { }).Error; err != nil {
fmt.Println("更新颜色字段失败", index, item.ID, item.Content, err) fmt.Println("更新颜色字段失败", index, item.ID, item.Content, err)
continue continue

View File

@@ -13,6 +13,12 @@ type RGB struct {
R, G, B int R, G, B int
} }
// 根据每个聚类中心包含的颜色数量进行排序
type cluster struct {
center RGB
count int
}
// 计算两个 RGB 颜色的欧氏距离 // 计算两个 RGB 颜色的欧氏距离
func distance(c1, c2 RGB) float64 { func distance(c1, c2 RGB) float64 {
return math.Sqrt(float64((c1.R-c2.R)*(c1.R-c2.R) + (c1.G-c2.G)*(c1.G-c2.G) + (c1.B-c2.B)*(c1.B-c2.B))) return math.Sqrt(float64((c1.R-c2.R)*(c1.R-c2.R) + (c1.G-c2.G)*(c1.G-c2.G) + (c1.B-c2.B)*(c1.B-c2.B)))