修正色调排序
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