anjia / blog

博客,积累与沉淀
106 stars 4 forks source link

颜色量化 #74

Open anjia opened 4 years ago

anjia commented 4 years ago

背景

R、G、B 各有一个 byte,所以我们要用 (2^8)^3=2^24 种颜色表示。

场景一:有种视频接口 VGA,同一时刻无法显示超过 256 种颜色。所以,我们需要将 2^24 种颜色,用 256 种颜色来表示。或者,用 n 种颜色来替代 m 种颜色(m>n)。

场景二:PNG 的压缩。PNG 有种编码方式,是使用调色板的编码方案。即使用最多 256 种颜色表示一张图片。如此,每种颜色就都可以用一个 byte 来替代了。

对于 24-bit 的图片来说,颜色空间是连续的(断的地方肉眼几乎不可见)。要将连续的颜色空间,映射到 256 种离散的颜色上,这种将连续变量映射到离散集合上就叫做量化。

颜色量化(color quantization)的方法:

中位切割算法

算法:

  1. 提取整张图片里的所有 RGB,将其转换成一个 RGB 立方体
  2. 找到立方体的最长边,从"中位数"处切割。得到两个数量点相同的立方体
  3. 对分割成的立方体,重复步骤2,直到得到 256 个(目标个数)立方体
  4. 256 个立方体的“质心”,就是要计算的 256 个颜色值

说明:

https://github.com/lokesh/color-thief 用了中位切割算法

getPalette(sourceImage, colorCount=10, quality=10) 返回:[{r,g,b},{r,g,b},...,{r,g,b}]

使用中位切割算法将相似的颜色聚类