请注意,imshow函数仅适用于在[0,1]间隔中规范化的RGB值,这就是为什么我们需要除以255.
用k-means选择
如在开始时所预期的,执行颜色量化的一种常见方法是使用聚类算法。在这种情况下,我们将使用k-means的最小化集群内的质心和其他点之间的距离之和,来进行量化。假设k-means聚类算法使用的距离是欧几里得距离,则它是适用于与RGB和Lab空间两者的颜色量化的自然拟合。为了这篇文章的目的,我先假设你知道k-means如何工作。
该过程包括应用具有多个质心的k-means算法,所述的质心(数量)指我们想要调色板被组成的颜色的数量。然后我们使用得到的质心作为调色板的一部分的颜色。之后,如在随机选择中那样,将每种颜色重新映射到调色板中的那些中最接近的一个。在给定k-means的性质下,最近的颜色将准确地对应于其一部分聚类的质心所代表的颜色。
重要的是,具有相同颜色的图像中的n
个像素在颜色空间中包括n
个重叠点,而不在单个点中。实际上在随机选择的情况下它没有差别,但是当应用k-means算法时它有很多差别。
请记住,Lab空间中的欧氏距离是均匀的,差异是由人眼感知的。因此,通过这种选择,我们可以期望使用Lab空间应该具有比RGB更好的视觉效果。
类似于下面的其他图,它在视觉上解释了RGB空间情况下的整个过程,但使用的是k-means算法。 即使在本示例中,最终调色板也是由三种颜色组成,为了简单起见,蓝色通道固定为值0。图像的所有像素用RGB编码表示,然后如在随机选择的情况下映射到RGB空间中。 然后应用K-means算法,并且聚类的质心被选择为调色板的一部分。 最后,如在随机调色板选择中,根据欧几里得距离将所有颜色重新映射到最接近的所选颜色。
这里由使用k-means在RGB颜色空间中生成的输出图像。 它们的调色板分别由8,16,32和64种颜色组成。
在Lab颜色空间中用k-means生成的输出图像。 在这种情况下,它们的调色板分别由8,16,32和64种颜色组成。
代码
这里是使用k-means算法来执行颜色量化的代码。以下函数具有与用随机选择的函数相同的功能,并且已经讨论过的关于光栅加载,颜色空间转换和结果可视化的内容仍然适用。