如何在pandas系列中使用python-colormath的Delta E功能

时间:2017-03-10 09:23:03

标签: python pandas colors

我正在使用python-colormath来计算Lab颜色列表之间的色差delta E 2000。

我有两个pandas数据帧(df1和df2),在每个数据帧中我记录了Lab值。

这是我的代码:

L1 = df1.L
a1 = df1.a
b1 = df1.b

L2 = df2.L
a2 = df2.a
b2 = df2.b

colors1 = LabColor(lab_l= L1, lab_a = a1, lab_b = b1)
colors2 = LabColor(lab_l= L2, lab_a = a2, lab_b = b2)

delta_e_76 = delta_e_cie1976(colors1, colors2)

>> TypeError: cannot convert the series to <class 'float'>

有没有办法将pandas系列转换为LabColor类对象?

2 个答案:

答案 0 :(得分:0)

似乎python-colormath不支持使用无法转换为float的任何内容作为其LabColor对象的输入。

如果你想继续使用python-colormath,你可以遍历系列对象而不是直接使用它。

delta_e_76 = []
for L1, a1, b1, L2, a2, b2 in zip(df1.L, df1.a, df1.b, df2.L, df2.a, df2.b):
    colors1 = LabColor(lab_l= L1, lab_a = a1, lab_b = b1)
    colors2 = LabColor(lab_l= L2, lab_a = a2, lab_b = b2)
    delta_e_76.append(delta_e_cie1976(colors1, colors2))

或者,您可以尝试打包设置并调用delta_e_cie1976并使用numpy的vectorize函数进行包装。

@np.vectorize
def delta_e_vectorized(L1, a1, b1, L2, a2, b2):
    colors1 = LabColor(lab_l=L1, lab_a=a1, lab_b=b1)
    colors2 = LabColor(lab_l=L2, lab_a=a2, lab_b=b2)
    return delta_e_cie1976(colors1, colors2)

delta_e_76 = delta_e_vectorized(df1.L, df1.a, df1.b, df2.L, df2.a, df2.b)

答案 1 :(得分:0)

似乎python-colormath不支持使用无法转换为float的任何内容作为其LabColor对象的输入。

为了保持矢量化计算的优势,您可能希望使用支持此类操作的其他库来查看,例如Colour

(免责声明,我参与了这个项目)

使用colour可以执行此操作来计算颜色差异:

from colour import delta_E_CIE1976, tstack

delta_e_76 = delta_E_CIE1976(tstack([df1.L, df1.a, df1.b]),
                             tstack([df2.L, df2.a, df2.b]),
                             )