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 在 图像
12,118 每月下载量
在 3 crate 中使用
105KB
2K SLoC
kmeans-colors
使用 k-means++ 初始化对图像进行 k-means 聚类,以计算图像中的 k 个平均颜色。
kmeans-colors 包裹了一个通用的 k-means 库,该库支持 Lloyd 和 Hamerly 算法,用于任意数据类型。k-means 可以找到图像的主要颜色或调色板。此 crate 中的其他应用包括二值化和“颜色风格”转换。

要作为库使用,请将以下内容添加到您的 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

kmeans_colors -i gfx/pink.jpg --no-file --palette --proportional
![]()
kmeans_colors -i gfx/flowers.jpg --no-file --palette --proportional --sort
![]()
默认情况下,调色板将由大小相等的色块组成。通过传递--proportional将按比例缩放色块以反映其在图像中的存在。默认排序方式是从暗到亮,通过传递--sort将按颜色出现频率从高到低排序调色板。还可以指定调色板的--height和--width以及输出名称,使用--op。传递-k 1将生成图像的平均颜色。--no-file用于跳过保存原始图像的结果。
3) find子命令
a) 二进制费里斯轮例子
我们可以使用k-means清理这个涂鸦并从中提取线条。这篇文章是折叠的,上面涂满了荧光笔和蓝色铅笔,纸的背面也有墨迹。

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

第一次尝试使用2种颜色,不幸的是,这只能拾取荧光笔的颜色和墨迹及纸张的平均颜色。
kmeans_colors -i gfx/ferris.jpg -k 3 -o gfx/ferris-3color.png

接下来,我们尝试k=3。这要好得多,并且显示我们可以将记号笔颜色与墨迹分开。但这还不是我们想要的。
kmeans_colors find -c 000000,ffffff -i gfx/ferris.jpg -o gfx/ferris-find.png

有效黑白分离的解决方案是使用带有-c选项的find子命令,这允许我们指定黑色(#000000)和白色(#ffffff)。k-means算法只需要一次迭代即可找到与通过-c传递的颜色最接近的颜色。
b) --replace标志
使用--replace,我们在图像上运行k-means计算,并用我们自己的自定义颜色替换中心点。我们输入的颜色将按从暗到亮的顺序替换中心点,我们使用的颜色数量将是我们计算的k-means中心点的数量;如果我们指定4种颜色,我们将使用与示例1中相同的-k 4替换我们计算的色组。

我们可以将左侧图像的平均颜色转移到右侧的灯笼上。运行以下命令按从暗到亮的顺序打印下面的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

图像的上半部分是默认在Lab模式下运行的先前的命令。图像的下半部分是先前的命令,添加了--rgb标志。
不使用--replace传递相同的颜色会产生下面的图像,它使用我们在提供的列表中找到的最近的颜色来着色像素。
kmeans_colors find -i gfx/lanterns.jpg -c 492f38,6c363e,8d444e,ae525b,8c6779,677a9b,
b87078,4b95bb,a499b0,d7969d,e3b8c0,c5c6da

回到费里斯轮例子,我们可以使用--replace重新着色图像。
kmeans_colors find -i gfx/ferris-find.png -c de4a18,bee0fa --replace -o gfx/ferris-replace.png

-和-可以与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