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