Python 如何用感知一致性对HSV空间进行采样

Python 如何用感知一致性对HSV空间进行采样,python,colors,hsv,cielab,Python,Colors,Hsv,Cielab,我可以采样HSV空间(固定的s和v) 然而,所有这些颜色在感知上并不一致 我可以通过运行colormath软件包中的deltaE2000方程(deltaE2000)来确认这一点。结果如下所示: 这些值是三角形值,颜色0-15对应于色调角度位置。如您所见,有些颜色低于感知阈值 所以,问题是,s和v固定时,我是否可以对hsv空间进行均匀采样?如果没有,我如何在空间中采样,使颜色排列为相邻的色调相似性s和v变化尽可能小?我尝试了一些方法,但最终似乎成功了。它均匀地隔开色调值,然后轻推它们,直到它

我可以采样HSV空间(固定的
s
v

然而,所有这些颜色在感知上并不一致

我可以通过运行colormath软件包中的deltaE2000方程(deltaE2000)来确认这一点。结果如下所示:

这些值是三角形值,颜色0-15对应于色调角度位置。如您所见,有些颜色低于感知阈值


所以,问题是,
s
v
固定时,我是否可以对hsv空间进行均匀采样?如果没有,我如何在空间中采样,使颜色排列为相邻的色调相似性
s
v
变化尽可能小?

我尝试了一些方法,但最终似乎成功了。它均匀地隔开色调值,然后轻推它们,直到它们在视觉上是一致的

从colormath导入颜色对象、颜色差异、颜色转换
SAT=1.0
VAL=1.0
颜色计数=16
微移大小=0.2
def色调至色调实验室(色调):
返回颜色转换。转换颜色(
color_objects.HSVColor(色调、SAT、VAL)、color_objects.LabColor
)
def获得等间距(数字,iters=100):
#在色调空间中创建具有均匀间距值的色调
色调=[360*x/范围内x的数字(数字)]
对于范围内(iters):
#将色调转换为CIELAB颜色
cols=[色调中h的色调到实验室(h)]
#计算出相邻两组之间的知觉差异
#颜色
三角洲=[
范围(len(cols))内i的色差delta_e_cie2000(cols[i],cols[i-1])
]
#将每个色调移向最远的相邻颜色
#感性地离开
轻推=[
(增量[(i+1)%len(增量)]-增量[i])*微移大小
对于范围内的i(长度(增量))
]
色调=[(h+d)%360,用于拉链式(h,d)(色调,轻推)]
返回色调
打印(等距打印(颜色计数,iters=1000))
如果设置错误(将其更改为
2
这里不会产生类似彩虹的效果),则“轻推大小”(NUDGE_SIZE)可能会弄糟它,我认为最佳值取决于您进行的迭代次数和生成的颜色数量。相邻颜色的
delta_e_cie2000
值(给定设置)为
[16.290288769191324, 16.290288766871242, 16.290288753399196, 16.290288726186013, 16.290288645469946, 16.290288040904777, 16.290288035037598, 16.290288051426675, 16.290288079361915, 16.290288122430887, 16.290288180738187, 16.290288265350803, 16.290288469198916, 16.29028866254433, 16.2902887136652]
,非常统一:我认为对于这几种颜色来说,
iters=1000
太过分了。我在这里使用的是普通列表,但它应该转换为NumPy数组,并且可能运行得更快一些

算法的工作原理如下:

  • 从一组天真的均匀色调开始
  • 计算相邻颜色对之间的感知差异
  • 将每个色调稍微移向其感知上最不同的相邻色调。此移动的大小与
    轻推大小成比例
  • 重复2-3次,直到颜色被轻推
    iters

  • 我尝试了一些方法,但最后似乎奏效了。它将色调值均匀地隔开,然后推动它们,直到它们在感知上是一致的

    从colormath导入颜色对象、颜色差异、颜色转换
    SAT=1.0
    VAL=1.0
    颜色计数=16
    微移大小=0.2
    def色调至色调实验室(色调):
    返回颜色转换。转换颜色(
    color_objects.HSVColor(色调、SAT、VAL)、color_objects.LabColor
    )
    def获得等间距(数字,iters=100):
    #在色调空间中创建具有均匀间距值的色调
    色调=[360*x/范围内x的数字(数字)]
    对于范围内(iters):
    #将色调转换为CIELAB颜色
    cols=[色调中h的色调到实验室(h)]
    #计算出相邻两组之间的知觉差异
    #颜色
    三角洲=[
    范围(len(cols))内i的色差delta_e_cie2000(cols[i],cols[i-1])
    ]
    #将每个色调移向最远的相邻颜色
    #感性地离开
    轻推=[
    (增量[(i+1)%len(增量)]-增量[i])*微移大小
    对于范围内的i(长度(增量))
    ]
    色调=[(h+d)%360,用于拉链式(h,d)(色调,轻推)]
    返回色调
    打印(等距打印(颜色计数,iters=1000))
    
    如果设置错误(将其更改为
    2
    此处不会产生类似彩虹的效果),那么
    轻推大小
    可能会将其搞糟,我认为最佳值取决于您进行的迭代次数和生成的颜色数量。相邻颜色的
    delta_e_cie2000
    值(具有给定的设置)为
    [16.290288769191324, 16.290288766871242, 16.290288753399196, 16.290288726186013, 16.290288645469946, 16.290288040904777, 16.290288035037598, 16.290288051426675, 16.290288079361915, 16.290288122430887, 16.290288180738187, 16.290288265350803, 16.290288469198916, 16.29028866254433, 16.2902887136652]
    ,非常统一:我认为对于这几种颜色来说,
    iters=1000
    太过分了。我在这里使用的是普通列表,但它应该转换为NumPy数组,并且可能运行得更快一些

    算法的工作原理如下:

  • 从一组天真的均匀色调开始
  • 计算相邻颜色对之间的感知差异
  • 将每个色调稍微移向其感知上最不同的相邻色调。此移动的大小与
    轻推大小成比例
  • 重复2-3次,直到颜色被轻推
    iters

  • 你在滥用三角洲。这样的功能不适合这么大的胡
    hue_gradient = np.linspace(0, 360,16)#sample 16 different equally spread hues
    hsv = np.ones(shape=(1, len(hue_gradient), 3), dtype=float)*0.75#set sat and brightness to 0.75
    hsv[:, :, 0] = hue_gradient#make one array
    hsv
    
    
    array([[[  0.  ,   0.75,   0.75],
            [ 24.  ,   0.75,   0.75],
            [ 48.  ,   0.75,   0.75],
            [ 72.  ,   0.75,   0.75],
            [ 96.  ,   0.75,   0.75],
            [120.  ,   0.75,   0.75],
            [144.  ,   0.75,   0.75],
            [168.  ,   0.75,   0.75],
            [192.  ,   0.75,   0.75],
            [216.  ,   0.75,   0.75],
            [240.  ,   0.75,   0.75],
            [264.  ,   0.75,   0.75],
            [288.  ,   0.75,   0.75],
            [312.  ,   0.75,   0.75],
            [336.  ,   0.75,   0.75],
            [360.  ,   0.75,   0.75]]])