#rgb #k-means #color #clustering #color-space #lab #graphics

bin+lib kmeans_colors

简单的 k-means 聚类算法,用于在图像中找到主要颜色。由一个通用的 k-means 实现支持,作为一个独立的库提供。

10 个版本 (5 个破坏性版本)

0.6.0 2023年7月23日
0.5.0 2022年3月17日
0.4.0 2021年3月13日
0.3.4 2020年11月16日
0.1.0 2020年5月7日

#139图像

Download history 752/week @ 2024-04-22 578/week @ 2024-04-29 883/week @ 2024-05-06 2345/week @ 2024-05-13 2430/week @ 2024-05-20 2470/week @ 2024-05-27 2665/week @ 2024-06-03 2650/week @ 2024-06-10 3162/week @ 2024-06-17 2817/week @ 2024-06-24 2763/week @ 2024-07-01 2925/week @ 2024-07-08 2774/week @ 2024-07-15 3011/week @ 2024-07-22 2983/week @ 2024-07-29 3044/week @ 2024-08-05

12,118 每月下载量
3 crate 中使用

MIT/Apache

105KB
2K SLoC

kmeans-colors

Build Status Crates.io Docs.rs

使用 k-means++ 初始化对图像进行 k-means 聚类,以计算图像中的 k 个平均颜色。

kmeans-colors 包裹了一个通用的 k-means 库,该库支持 Lloyd 和 Hamerly 算法,用于任意数据类型。k-means 可以找到图像的主要颜色或调色板。此 crate 中的其他应用包括二值化和“颜色风格”转换。

Animation of flowers

要作为库使用,请将以下内容添加到您的 Cargo.toml 中;添加 palette_color 功能以启用 palette 颜色类型。可执行文件构建可以在 https://github.com/okaneco/kmeans-colors/releases 中找到。

[dependencies.kmeans_colors]
version = "0.6"
default-features = false

1) 基本用法

k-means 聚类通过从图像中的 k 个颜色的初始随机猜测(称为 centroids)开始工作。对于每一步,遍历图像中的每个像素以找到与它颜色最接近的质心。然后,质心计算靠近它们的所有颜色的平均值并将移动到该颜色。这个过程重复进行,直到质心停止移动或达到最大步数。

kmeans_colors -i gfx/pink.jpg -k 2 -o pink2

上面的动画是使用前面的命令从 k=2 到 k=9 的 k-means 聚类的组合。 -k 是要在图像中找到的颜色数量。 -r 是要执行的运行次数,-o 指定输出。默认情况下,图像将保存为 .png 文件。不需要 -o 选项。

2) 调色板

kmeans_colors -i gfx/mountains.jpg --no-file --palette

Picture of mountain and color palette

kmeans_colors -i gfx/pink.jpg --no-file --palette --proportional

Green and red color palette

kmeans_colors -i gfx/flowers.jpg --no-file --palette --proportional --sort

Blue and pink proportional color palette

默认情况下,调色板将由大小相等的色块组成。通过传递--proportional将按比例缩放色块以反映其在图像中的存在。默认排序方式是从暗到亮,通过传递--sort将按颜色出现频率从高到低排序调色板。还可以指定调色板的--height--width以及输出名称,使用--op。传递-k 1将生成图像的平均颜色。--no-file用于跳过保存原始图像的结果。

3) find子命令

a) 二进制费里斯轮例子

我们可以使用k-means清理这个涂鸦并从中提取线条。这篇文章是折叠的,上面涂满了荧光笔和蓝色铅笔,纸的背面也有墨迹。

Drawing of Ferris the crab with highlighter


kmeans_colors -i gfx/ferris.jpg -k 2 -o gfx/ferris-2color.png

Yellow highlighter on paper

第一次尝试使用2种颜色,不幸的是,这只能拾取荧光笔的颜色和墨迹及纸张的平均颜色。


kmeans_colors -i gfx/ferris.jpg -k 3 -o gfx/ferris-3color.png

Crab drawing with 3 colors

接下来,我们尝试k=3。这要好得多,并且显示我们可以将记号笔颜色与墨迹分开。但这还不是我们想要的。


kmeans_colors find -c 000000,ffffff -i gfx/ferris.jpg -o gfx/ferris-find.png

Binary black and white crab drawing

有效黑白分离的解决方案是使用带有-c选项的find子命令,这允许我们指定黑色(#000000)和白色(#ffffff)。k-means算法只需要一次迭代即可找到与通过-c传递的颜色最接近的颜色。

b) --replace标志

使用--replace,我们在图像上运行k-means计算,并用我们自己的自定义颜色替换中心点。我们输入的颜色将按从暗到亮的顺序替换中心点,我们使用的颜色数量将是我们计算的k-means中心点的数量;如果我们指定4种颜色,我们将使用与示例1中相同的-k 4替换我们计算的色组。

Tree and sky Hanging lanterns

我们可以将左侧图像的平均颜色转移到右侧的灯笼上。运行以下命令按从暗到亮的顺序打印下面的12种颜色,以十六进制形式。

kmeans_colors -i gfx/flowers.jpg -p -k 12 --no-file
492f38,6c363e,8d444e,ae525b,8c6779,677a9b,b87078,4b95bb,a499b0,d7969d,e3b8c0,c5c6da

然后,我们可以使用这些颜色在右侧图像上使用-选项。

kmeans_colors find -i gfx/lanterns.jpg -c 492f38,6c363e,8d444e,ae525b,8c6779,677a9b,
b87078,4b95bb,a499b0,d7969d,e3b8c0,c5c6da --replace

Lanterns

图像的上半部分是默认在Lab模式下运行的先前的命令。图像的下半部分是先前的命令,添加了--rgb标志。

不使用--replace传递相同的颜色会产生下面的图像,它使用我们在提供的列表中找到的最近的颜色来着色像素。

kmeans_colors find -i gfx/lanterns.jpg -c 492f38,6c363e,8d444e,ae525b,8c6779,677a9b,
b87078,4b95bb,a499b0,d7969d,e3b8c0,c5c6da

Lanterns with purple cast


回到费里斯轮例子,我们可以使用--replace重新着色图像。

kmeans_colors find -i gfx/ferris-find.png -c de4a18,bee0fa --replace -o gfx/ferris-replace.png

Orange crab on blue background

--可以与find --replace子命令和标志组合一起使用。它们与单独的find没有作用,因为只需要一次迭代即可生成结果。

4) 打印,百分比,& 详细

kmeans_colors-i gfx/粉色.jpg-k2 -pv--pct--no-file

可以使用 - 详细标志来打印迭代的成果。随着颜色的收敛,分数会变得更小。如果结果意外,这有助于故障排除,因为 K-means 可能没有收敛。如以下所示,- 标志按从最深到最亮的顺序以十六进制形式打印颜色。使用 --pct 标志可以打印结果图像中每种颜色的百分比。

gfx/pink.jpg
Score: 62.90416
Score: 0.05048233
Iterations: 1
4e5f60,dc5d5c
0.6605,0.3395

使用说明

K-means 可能会陷入局部最小值,从而阻止它找到最佳结果。为了解决这个问题,可以使用 - 来指定运行次数以重复该过程并保留最佳结果。可以使用 - 标志来指定执行的迭代次数上限。最后,可以使用 - 来指定收敛因子。较大的图像文件需要更长的时间来完成,因此为这些选项仔细选择了默认值。

当处理透明 PNG 图像时,可以使用 --transparent 标志。K-means 将不考虑任何透明像素,进行计算。否则,透明像素将变为哑光色,并负面对结果产生影响。

功能

  • 从图像创建调色板
  • Lab 空间或 RGB 空间计算
  • 找到与输入颜色最近的颜色
  • 用自定义颜色替换颜色
  • 可调整迭代次数和重复次数
  • 打印平均颜色
  • 打印图像中每种颜色的百分比
  • 支持透明度
  • kmeans++ 中心初始化
  • 支持将多个图像作为输入进行批量处理
  • 指定随机种子以获得可重复的结果

故障排除

如果您在命令行工具中遇到无效颜色错误或十六进制颜色长度错误,请尝试用引号将颜色字符串括起来。

例如,不要使用 -000000,ffffff,而是使用 '000000,ffffff'

许可证

此软件包可使用以下许可证之一进行许可:

根据您的情况选择。

依赖关系

~1.3–3MB
~57K SLoC