colormath库delta_e_cie2000函数报错:numpy无asscalar属性求解
问题原因及CIE2000色差计算解决方案
问题原因
numpy 1.25及后续版本彻底移除了numpy.asscalar()函数——该函数早在之前的版本就被标记为弃用,官方推荐使用.item()方法替代。你之前的代码能正常运行,是因为当时环境的numpy版本较低,保留了这个弃用函数;而现在本地和Google Colab的numpy版本已更新,所以触发了AttributeError。
修复方法
找到代码中所有调用np.asscalar(xxx)的位置,替换为xxx.item()即可。如果是明确类型的标量数组,也可以直接用float(xxx)或int(xxx)完成转换,效果一致。
完整CIE2000色差计算示例
要计算RGB颜色的CIE2000色差,需先将RGB转换为Lab颜色空间(CIE2000色差基于Lab空间计算),以下是修复后的完整代码:
import numpy as np def rgb_to_lab(rgb): # 将RGB值从0-255归一化到0-1 rgb = np.array(rgb, dtype=np.float64) / 255.0 # sRGB转XYZ mask = rgb > 0.04045 rgb[mask] = ((rgb[mask] + 0.055) / 1.055) ** 2.4 rgb[~mask] = rgb[~mask] / 12.92 xyz = np.dot(rgb, np.array([ [0.4124564, 0.3575761, 0.1804375], [0.2126729, 0.7151522, 0.0721750], [0.0193339, 0.1191920, 0.9503041] ])) # XYZ转Lab(参考白点D65) xyz_ref = np.array([0.95047, 1.0, 1.08883]) xyz = xyz / xyz_ref mask = xyz > 0.008856 xyz[mask] = xyz[mask] ** (1/3) xyz[~mask] = (7.787 * xyz[~mask]) + 16/116 L = (116 * xyz[1]) - 16 a = 500 * (xyz[0] - xyz[1]) b = 200 * (xyz[1] - xyz[2]) return np.array([L, a, b]) def delta_e_cie2000(lab1, lab2): L1, a1, b1 = lab1 L2, a2, b2 = lab2 # 计算C和h C1 = np.sqrt(a1**2 + b1**2) C2 = np.sqrt(a2**2 + b2**2) C_avg = (C1 + C2) / 2 G = 0.5 * (1 - np.sqrt(C_avg**7 / (C_avg**7 + 25**7))) a1_prime = a1 * (1 + G) a2_prime = a2 * (1 + G) C1_prime = np.sqrt(a1_prime**2 + b1**2) C2_prime = np.sqrt(a2_prime**2 + b2**2) C_avg_prime = (C1_prime + C2_prime) / 2 # 计算h h1_prime = np.arctan2(b1, a1_prime) h1_prime = h1_prime + 2 * np.pi if h1_prime < 0 else h1_prime h2_prime = np.arctan2(b2, a2_prime) h2_prime = h2_prime + 2 * np.pi if h2_prime < 0 else h2_prime h_avg_prime = (h1_prime + h2_prime) / 2 if np.abs(h1_prime - h2_prime) > np.pi: h_avg_prime += np.pi T = 1 - 0.17 * np.cos(h_avg_prime - np.pi/6) + 0.24 * np.cos(2 * h_avg_prime) + 0.32 * np.cos(3 * h_avg_prime + np.pi/30) - 0.2 * np.cos(4 * h_avg_prime - 21*np.pi/60) delta_L_prime = L2 - L1 delta_C_prime = C2_prime - C1_prime delta_h_prime = h2_prime - h1_prime if np.abs(delta_h_prime) > np.pi: delta_h_prime -= 2 * np.pi if delta_h_prime > 0 else -2 * np.pi delta_H_prime = 2 * np.sqrt(C1_prime * C2_prime) * np.sin(delta_h_prime / 2) # 计算权重因子 S_L = 1 + (0.015 * (L1 - 50)**2) / np.sqrt(20 + (L1 - 50)**2) S_C = 1 + 0.045 * C_avg_prime S_H = 1 + 0.015 * C_avg_prime * T R_T = -2 * np.sqrt(C_avg_prime**7 / (C_avg_prime**7 + 25**7)) * np.sin(2 * np.radians(30 * np.exp(-((np.degrees(h_avg_prime) - 275)/25)**2))) # 计算delta E delta_e = np.sqrt( (delta_L_prime / S_L)**2 + (delta_C_prime / S_C)**2 + (delta_H_prime / S_H)**2 + R_T * (delta_C_prime / S_C) * (delta_H_prime / S_H) ) # 替换原np.asscalar为.item() return delta_e.item() # 示例使用 rgb1 = [255, 0, 0] # 红色 rgb2 = [0, 255, 0] # 绿色 lab1 = rgb_to_lab(rgb1) lab2 = rgb_to_lab(rgb2) print(f"CIE2000色差: {delta_e_cie2000(lab1, lab2):.2f}")
这段代码中已经将所有需要提取标量的地方替换为.item(),同时包含了完整的RGB转Lab和CIE2000色差计算逻辑,可直接运行。
内容的提问来源于stack exchange,提问作者Thanos Lyras
相关产品推荐
相关产品推荐

