From cc5471284eca8f49ec816d71e0a4b9815096765a Mon Sep 17 00:00:00 2001 From: satori Date: Fri, 15 Nov 2024 11:58:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=89=B2=E8=B0=83=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/graphql.go | 42 +++++++++++++++++++++++++++++++++++------- api/kMeans.go | 6 ++++++ 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/api/graphql.go b/api/graphql.go index 62c3c32..f0cde4a 100644 --- a/api/graphql.go +++ b/api/graphql.go @@ -7,6 +7,7 @@ import ( "os" "reflect" "regexp" + "sort" "strconv" "strings" "time" @@ -141,14 +142,41 @@ func NewSchema(config Config) (graphql.Schema, error) { 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{}{ - "color_0_r": centers[0].R, - "color_0_g": centers[0].G, - "color_0_b": centers[0].B, - "color_1_r": centers[1].R, - "color_1_g": centers[1].G, - "color_1_b": centers[1].B, + "color_0_r": sortedCenters[0].R, + "color_0_g": sortedCenters[0].G, + "color_0_b": sortedCenters[0].B, + "color_1_r": sortedCenters[1].R, + "color_1_g": sortedCenters[1].G, + "color_1_b": sortedCenters[1].B, }).Error; err != nil { fmt.Println("更新颜色字段失败", index, item.ID, item.Content, err) continue diff --git a/api/kMeans.go b/api/kMeans.go index 83a6ea2..c3c9115 100644 --- a/api/kMeans.go +++ b/api/kMeans.go @@ -13,6 +13,12 @@ type RGB struct { R, G, B int } +// 根据每个聚类中心包含的颜色数量进行排序 +type cluster struct { + center RGB + count int +} + // 计算两个 RGB 颜色的欧氏距离 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)))