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

2023 年 3 月 14 日 星期二
14
AI 生成的摘要

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

简单介绍

最近在Stack OverFlow上看到了一种新的取色算法,之前因为和某个人有一点点的竞争就索性有写这个的想法,然而尴尬的是,他利用K-means算法已经实现了一个相对来说不错的取色方案,不过貌似是整个图片的随机像素点取色,实际上需要些更多的步骤才可以实现真正需要的取色,按照对法大佬的思路,我写了个相对可以的主体取色,或许有点用

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储存起来

  1. 将已经解码过的图片采取一个简单的轮询,使用简单的对比来计算哪种主体颜色是最多的
  2. 不断对比,直到找到那个占比最大的主体颜色,然后返回对应的颜色

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

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

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