Golang使用原生库实现取色算法
简单介绍
最近在Stack OverFlow上看到了一种新的取色算法,之前因为和某个人有一点点的竞争就索性有写这个的想法,然而尴尬的是,他利用K-means算法已经实现了一个相对来说不错的取色方案,不过貌似是整个图片的随机像素点取色,实际上需要些更多的步骤才可以实现真正需要的取色,按照对法大佬的思路,我写了个相对可以的主体取色,或许有点用
golang
func GetMainColor(img image.Image) color.Color {
model := color.Palette{
color.RGBA{A: 255}, // 黑色
color.RGBA{R: 255, A: 255}, // 红色
color.RGBA{G: 255, A: 255}, // 绿色
color.RGBA{B: 255, A: 255}, // 蓝色
color.RGBA{R: 255, G: 255, A: 255}, // 黄色
color.RGBA{G: 255, B: 255, A: 255}, // 青色
color.RGBA{R: 255, B: 255, A: 255}, // 品红色
color.RGBA{R: 255, G: 255, B: 255, A: 255}, // 白色
}
counts := make(map[color.Color]int)
for x := 0; x < img.Bounds().Max.X; x++ {
for y := 0; y < img.Bounds().Max.Y; y++ {
c := model.Convert(img.At(x, y))
counts[c]++
}
}
var maxColor color.Color
var maxCount int
for c, count := range counts {
if count > maxCount {
maxColor = c
maxCount = count
}
}
return maxColor
这部分其实比较简单,大致的思路是:
- 我将颜色分为八种颜色,并将它们作为一个简单的map储存起来
- 将已经解码过的图片采取一个简单的轮询,使用简单的对比来计算哪种主体颜色是最多的
- 不断对比,直到找到那个占比最大的主体颜色,然后返回对应的颜色
大致思路是这样的。这部分的颜色返回需要一个RGBA,你可能需要写一个方法将他赋予一个变量进行使用
同时呢, imagemagick 也可用于对图片的取色,这边放上一个stack overflow的地址 Link 就这样吧w 最近没什么精力,好累ama