修正色调排序
This commit is contained in:
@@ -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
|
||||
|
@@ -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)))
|
||||
|
Reference in New Issue
Block a user