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