在我们对各式各样的数据进行可视化时,当不同类的数据过多,若随机选取RGB图像会导致很难辨别,因此,我们有必要生成一组针对人眼的差异较大的RGB颜色。
CIEDE2000颜色差异度量是一个更加准确的颜色差异指标,它考虑了人眼的视觉感知特性,能够更好地反映实际的颜色差异情况。具体来说,它将三个颜色属性分别转化到LCH(明度、色度、色调)颜色空间,然后计算两个LCH颜色向量之间的距离。与欧几里得距离不同,CIEDE2000距离具有对颜色空间的非线性适应性,更能反映人眼在不同颜色和明度下的感知特性。在Python中,可以使用colormath.color_diff.delta_e_cie2000
函数计算CIEDE2000距离。
我们随机初始化大量的RGB颜色,从中选取10个相互之间的CIEDE2000颜色差异最大的颜色。
以生成10个颜色为例:
import random
import colorsys
from colormath.color_objects import LabColor
from colormath.color_diff import delta_e_cie2000
def generate_random_colors(num_colors=100):
"""生成指定数量的随机RGB颜色"""
return [generate_random_color() for _ in range(num_colors)]
def generate_random_color():
"""生成一个随机的RGB颜色"""
hue = random.uniform(0, 360)
saturation = random.uniform(0.3, 1)
value = random.uniform(0.3, 1)
r, g, b = colorsys.hsv_to_rgb(hue/360, saturation, value)
return tuple(int(c * 255) for c in (r, g, b))
def find_max_distinct_colors(colors, num_colors=10):
# 转换为Lab颜色空间
lab_colors = [LabColor(*rgb_color, illuminant='D50') for rgb_color in colors]
# 找到距离最大的两个颜色
max_distance = 0
max_indexes = None
for indexes in itertools.combinations(range(num_colors), 2):
distance = delta_e_cie2000(lab_colors[indexes[0]], lab_colors[indexes[1]])
if distance > max_distance:
max_distance = distance
max_indexes = indexes
selected_indexes = set(max_indexes)
# 选出距离最大的10个颜色
while len(selected_indexes) < num_colors:
distances = []
for i in range(len(colors)):
if i not in selected_indexes:
min_distance = float('inf')
for j in selected_indexes:
distance = delta_e_cie2000(lab_colors[i], lab_colors[j])
min_distance = min(min_distance, distance)
distances.append((min_distance, i))
distances.sort(reverse=True)
selected_indexes.add(distances[0][1])
return [colors[i] for i in selected_indexes]
# 生成随机颜色
colors = generate_random_colors(5000)
# 找到相互之间差异最大的10个颜色
result = find_max_distinct_colors(colors)
for i, color in enumerate(result):
print(f"第{i+1}个颜色:{color}")
import matplotlib.pyplot as plt
# 十个RGB颜色
colors = result
# 创建新的图像
fig, ax = plt.subplots()
# 循环绘制每个颜色
for i in range(len(colors)):
color = colors[i]
# 将RGB值转换成范围在0到1之间的浮点数
r = color[0] / 255.0
g = color[1] / 255.0
b = color[2] / 255.0
# 添加矩形块,每个块的大小为1x1
rect = plt.Rectangle((i, 0), 1, 1, color=(r, g, b))
ax.add_patch(rect)
# 设置坐标轴和标题等信息
ax.set_xlim((0, len(colors)))
ax.set_ylim((0, 1))
ax.set_xticks(range(len(colors)))
ax.set_xticklabels(['Color {}'.format(i+1) for i in range(len(colors))])
ax.set_title('RGB Color Visualization')
# 显示图像
plt.savefig('10_colors.png',dpi=300)
plt.show()