生成一组差异较大的RGB颜色

生成一组差异较大的RGB颜色

在我们对各式各样的数据进行可视化时,当不同类的数据过多,若随机选取RGB图像会导致很难辨别,因此,我们有必要生成一组针对人眼的差异较大的RGB颜色。

衡量颜色差异的指标

CIEDE2000颜色差异度量是一个更加准确的颜色差异指标,它考虑了人眼的视觉感知特性,能够更好地反映实际的颜色差异情况。具体来说,它将三个颜色属性分别转化到LCH(明度、色度、色调)颜色空间,然后计算两个LCH颜色向量之间的距离。与欧几里得距离不同,CIEDE2000距离具有对颜色空间的非线性适应性,更能反映人眼在不同颜色和明度下的感知特性。在Python中,可以使用colormath.color_diff.delta_e_cie2000函数计算CIEDE2000距离。

实现方法

我们随机初始化大量的RGB颜色,从中选取10个相互之间的CIEDE2000颜色差异最大的颜色。

python实现

以生成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()

你可能感兴趣的:(计算机视觉,数据可视化,计算机视觉,python)