python-3.x 你能把一种颜色的不同色调归为一组吗?

ars1skjm  于 2023-10-21  发布在  Python
关注(0)|答案(1)|浏览(93)

有没有一种方法可以从该颜色的色调/阴影开始找到基色,或者将一种颜色的变化组合在一起?
例如:#9c2b2b / RGB(156,43,43)是红色的阴影,#2354c4 / RGB(132,162,232)是蓝色的色调
但是,例如,给出这两种颜色,是否有一种方法可以在Python中确定这是红色(#FF0000 rgb(255,0,0))或蓝色(#0000FF rgb(0,0,255))的变体
我知道如何,我在网上找到了很多教程,并回答了如何通过采取基色和乘或减来做渐变。
谢谢你

vdzxcuhz

vdzxcuhz1#

有几种方法我可以想到如何做到这一点。下面的代码片段使用colorir

1.根据感知距离对颜色进行分组

>>> from colorir import *
# These are the categories we want to fit the colors in
# You can use anything here, I just sampled a few CSS colors
>>> tints_dict = {  
    'red': '#ff0000',
    'yellow': '#ffff00',
    'green': '#00ff00',
    'blue': '#0000ff',
    'black': '#000000',
    'white': '#ffffff'
}
>>> tints = Palette('tints', **tints_dict)

# Now to get the tint of a given color:
>>> tints.most_similar('#9c2b2b')
HexRGB('#ff0000')  # Pure red
# If you want its name:
>>> tints.get_names(tints.most_similar('#9c2b2b'))[0]
'red'

这种方法的问题是,我不认为你对“色调”的定义与色距的定义是一样的(这本身就很有争议,见this)。
这意味着,如果我们向'tints'数据集添加紫色,例如'#800080',palette.most_similar('#9c2b2b')将返回'#800080'。
这是因为'#9c2b2b'的感知亮度更接近我们的紫色,而不是红色。一个可能的解决方法是只使用类似亮度的参考“色调”。

2.按色相分组颜色

然而,这种解决方案可能更合适。
在这里,我们只关注它们的色调分量,而不是根据整体相似性对颜色进行分组。色调是颜色的“颜料”,也是HSL和HSV颜色系统的组成部分之一。

>>> def closest_hue(target, tints):
    # Interprets input target as hex string, convert to HSL and get hue component
    target_hue = HexRGB(target).hsl()[0]  
    closest = (None, 180)
    for color in tints:
        hue = color.hsl()[0]
        hue_dist = (min(target_hue, hue) - max(target_hue, hue)) % 360
        if hue_dist < closest[1]:
            closest = (color, hue_dist)
    return closest[0]

>>> closest_hue('#9c2b2b', tints)  # 'tints' is the same palette defined previously
HexRGB('ff0000')  # Pure red

这种方法的缺点,正如在原始帖子的评论中提到的,是它不能识别接近黑色,白色或灰色的颜色。
你也可以合并的方法,并说,对于混合,颜色非常接近黑色或白色应该与这些分组,但否则,他们应该按色调排序。由于这个问题没有单一的答案,你真的必须用我描述的方法来试验,看看什么最适合你。

相关问题