Geo*_*Kaf 4 classification image-processing computer-vision
我正在分析大量图像并提取主要颜色代码。
我想将它们分组为通用颜色名称范围,例如绿色、深绿色、浅绿色、蓝色、深蓝色、浅蓝色等。
我正在寻找一种与语言无关的方式来自己实现一些东西,如果有我可以研究的例子来实现这一点,我将非常感激。
在机器学习领域,您要做的称为分类,其目标是将其中一类的标签(颜色)分配给每个观察结果(图像)。为此,必须预先定义类。假设这些是我们要分配给图像的颜色:
要确定图像的主色,必须计算其每个像素与表中所有颜色之间的距离。请注意,此距离是在 RGB 颜色空间中计算的。要计算图像的第 ij 个像素与表的第 k 个颜色之间的距离,可以使用以下等式:
d_ijk = sqrt((r_ij-r_k)^2+(g_ij-g_k)^2+(b_ij-b_k)^2)
Run Code Online (Sandbox Code Playgroud)
在下一步中,对于每个像素,选择表中最接近的颜色。这是用于使用索引颜色压缩图像的概念(除了这里所有图像的调色板都是相同的,并且不会针对每个图像进行计算以最小化原始图像和索引图像之间的差异)。现在,正如 @jairoar 指出的,我们可以获得图像的直方图(不要与 RGB 直方图或强度直方图混淆),并确定重复次数最多的颜色。
为了展示这些步骤的结果,我使用了这件艺术品的随机裁剪!我的:

这是索引之前和之后图像的外观(左:原始,右:索引):
这些是最重复的颜色(左:索引色,右:主色):

但既然你说图像数量很大,那么你应该知道这些计算是比较耗时的。但好消息是有一些方法可以提高性能。例如,您可以使用城市街区或切比雪夫距离,而不是使用欧几里得距离(上面的公式) 。您还可以仅计算一小部分像素的距离,而不是计算图像中的所有像素。为此,您可以首先将图像缩放到更小的尺寸(例如 32 x 32),然后计算该缩小图像的像素。如果您决定调整图像大小,请不要费心使用双线性或双三次插值,因为不值得进行额外的计算。相反,选择最近邻,它实际上对原始图像
执行矩形格子采样。
虽然提到的改变会大大提高计算速度,但没有什么是免费的。这是性能与准确性的权衡。例如,在前两张图片中,我们看到最初被识别为橙色(代码 20)的图像在调整大小后已被识别为粉色(代码 26)。
为了确定算法的参数(距离测量、缩小图像尺寸和缩放算法),您必须首先以尽可能高的精度对大量图像执行分类操作,并将结果保留为基本事实。然后,通过多次实验,获得不使分类误差超过最大可容忍值的参数组合。