Golang使用原生库实现取色算法

2023 年 3 月 14 日 星期二(已编辑)
25
这篇文章上次修改于 2024 年 10 月 6 日 星期日,可能部分内容已经不适用,如有疑问可询问作者。

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 这部分其实比较简单,大致的思路是:

  1. 我将颜色分为八种颜色,并将它们作为一个简单的map储存起来
  2. 将已经解码过的图片采取一个简单的轮询,使用简单的对比来计算哪种主体颜色是最多的
  3. 不断对比,直到找到那个占比最大的主体颜色,然后返回对应的颜色

大致思路是这样的。这部分的颜色返回需要一个RGBA,你可能需要写一个方法将他赋予一个变量进行使用

同时呢, imagemagick 也可用于对图片的取色,这边放上一个stack overflow的地址 Link 就这样吧w 最近没什么精力,好累ama

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...