如何计算色彩值的相似度
原始问题:
已知颜色值X和颜色列表Array[A1,A2, ..... , An],如何在颜色列表Array中选出与X最接近的颜色?
解题思路:
1.先将颜色值X和颜色列表Array[A1,A2, ..... , An]中所有值都转换成lab空间的表示值
2.依次遍历计算X与A1, A2, ......, An的颜色距离,取颜色距离最低者即可
问题1:什么是颜色距离?怎么计算?
颜色差异(英语:Color difference),亦称颜色距离,是色彩学上的一个关注点。在未量化之前,人们只能用形容词来大概描述这个概念,这使得对颜色要求严格的工作者们很不方便。目前颜色距离的量化公式有两类,分别是色彩空间内的欧氏距离(这个较为交单),和国际照明委员会推荐的较为复杂但更接近人类知觉的公式CIEDE2000。
详见:wiki百科-颜色距离
1如果要使用欧式距离计算颜色距离,建议自己写一段程序实现(详见这个博客的最后)
2如果要使用CIEDE2000计算颜色距离,建议调用python-colormath库已经封装好的算法(先把颜色值都转换成lab空间的表示值,然后再计算颜色距离)
问题2:为什么要把颜色值转换到lab空间再做比较?
色彩有多种颜色空间表示方式,如RGB,HSV,HSL,LAB等等。不同的颜色空间适用场景差异很大。
RGB颜色空间是最常用的计算机颜色表示法:
RGB颜色空间相对简单,也最为普遍,就分为三个颜色通道,分别为红色,绿色,蓝色这三种基本色调的值,然后将这三个颜色融合在一起,也就成为一种颜色.
但用RGB比较颜色之间的相似度时,存在很大的问题,不建议直接使用,因为往往一个通道的一点改变,会导致最后融合在一起的颜色发生巨大变化,而如果三个通道的同时改变,却只会使最后的明暗发生变化,色调并不会产生巨大变化。
lab颜色空间更接近人眼对色彩的感知:
LAB颜色空间是基于人眼对颜色的感知,可以表示人眼所能感受到的所有颜色。L表示明度,A表示红绿色差,B表示蓝黄色差。两个颜色之见的色差:
ΔE=( ΔL^2 + ΔA^2 + ΔB^2 ) ^ (1/2)
ΔE 表示色差,ΔL/ΔA/Δb分别表示两个颜色之间在不同分量的差值。