大家好,今天为大家分享一个巨有趣的 Python 库 - colour。
Github地址:https://github.com/colour-science/colour
Python colour库是一个专注于颜色科学计算的开源库,为研究者、开发者和设计师提供了全面的色彩处理解决方案。该库实现了众多国际标准化组织(ISO)、国际照明委员会(CIE)和色彩工程师协会(SMPTE)定义的色彩标准和算法。colour库的设计理念是提供一套准确、可靠且易于使用的API,用于处理各种颜色转换、操作和分析任务。无论是进行科学研究、图像处理、视觉效果制作还是产品设计,colour库都能提供专业级别的色彩管理功能。
安装 colour库可以通过Python的包管理工具pip进行安装。由于其功能全面,它依赖于多个科学计算库,如NumPy和SciPy:
pip install colour-science
安装完成后,可以通过以下代码验证安装是否成功:
import colour print(colour.__version__)
如果安装成功,上述代码将输出colour库的版本号。
注意:colour库的导入名称是colour-science
,但在Python中导入时使用import colour
。
特性 全面的色彩空间支持 :支持超过30种色彩空间,包括RGB、XYZ、CIE Lab、HSL、HSV、CMYK等。色彩适应算法 :实现多种色彩适应模型,如Bradford、CAT02、Von Kries等。颜色外观模型 :支持CIECAM02和CAM16等颜色外观模型。
色彩差异计算 :实现多种色差计算方法,如CIEDE2000、CMC等。 色温转换 :支持相关色温(CCT)和色坐标之间的转换。基本功能 1. 颜色空间转换 在处理颜色数据时,不同的应用场景可能需要使用不同的颜色空间。colour库提供了丰富的色彩空间转换功能,可以在各种颜色表示方式之间进行精确转换。这在需要跨平台、跨设备进行颜色一致性处理时特别有用,如印刷设计、数字成像或色彩管理系统开发。
import colourimport numpy as np# RGB到XYZ的转换 RGB = np.array([0.45620519 , 0.03081071 , 0.04091952 ])# 使用sRGB颜色空间 XYZ = colour.sRGB_to_XYZ(RGB) print(f"RGB值 {RGB} 转换为XYZ值: {XYZ} " )# XYZ到CIE Lab的转换 Lab = colour.XYZ_to_Lab(XYZ) print(f"XYZ值 {XYZ} 转换为Lab值: {Lab} " )# RGB到HSV的转换 HSV = colour.RGB_to_HSV(RGB) print(f"RGB值 {RGB} 转换为HSV值: {HSV} " )# 色温到XYZ的转换 CCT = 6500 # 色温,单位:K XYZ_from_CCT = colour.CCT_to_XYZ(CCT) print(f"色温 {CCT} K 对应的XYZ值: {XYZ_from_CCT} " )
2. 颜色差异计算 在产品设计、质量控制和色彩匹配中,常常需要量化两种颜色之间的差异。colour库实现了多种国际标准的色差计算方法,使得开发者可以根据具体应用精确地测量颜色差异。这对于制造业的颜色质量控制、数字图像处理或视觉艺术创作都非常重要。
import colourimport numpy as np# 定义两个Lab颜色 Lab_1 = np.array([50.00 , 2.50 , -14.00 ]) Lab_2 = np.array([54.00 , -3.50 , -16.00 ])# 计算CIEDE2000色差 delta_E_00 = colour.delta_E(Lab_1, Lab_2, method='CIEDE2000' )
print(f"CIEDE2000色差: {delta_E_00} " )# 计算CIE 1976色差 delta_E_76 = colour.delta_E(Lab_1, Lab_2, method='CIE 1976' ) print(f"CIE 1976色差: {delta_E_76} " )# 计算CMC色差 delta_E_CMC = colour.delta_E(Lab_1, Lab_2, method='CMC' ) print(f"CMC色差: {delta_E_CMC} " )
3. 色度图生成 在色彩科学研究和教育中,色度图是理解颜色分布和色彩空间特性的重要工具。colour库提供了强大的色度图生成功能,可用于可视化色彩空间、分析色彩分布或研究色温变化。这在科学研究、教育演示或产品开发过程中都能提供宝贵的视觉参考。
import colourimport matplotlib.pyplot as pltfrom colour.plotting import *# 设置绘图样式 colour_style()# 绘制CIE 1931 xy色度图 plot_chromaticity_diagram_CIE1931(standalone=False )# 添加色温轨迹线 plot_planckian_locus(standalone=False )# 在色度图上标记几个点 xy = np.array([ [0.3 , 0.3 ], [0.4 , 0.5 ], [0.2 , 0.1 ] ]) plot_multi_colour_swatches( colour.xy_to_XYZ(xy), xy, standalone=False )# 显示图形 plt.title('CIE 1931 色度图与色温轨迹' ) plt.grid(True ) plt.show()
高级功能 1. 色彩适应和外观模型 人类视觉系统具有适应不同光源条件的能力,这被称为色彩适应。colour库实现了多种色彩适应模型和颜色外观模型,使开发者能够模拟人类视觉系统在不同照明条件下的色彩感知。这在跨光源色彩匹配、摄影图像处理或虚拟现实视觉效果设计中非常有价值。
import colourimport numpy as np# 定义一个颜色的XYZ值 XYZ = np.array([0.20654008 , 0.12197225 , 0.05136952 ])# 定义光源的白点 source_white = np.array([0.95045593 , 1.00000000 , 1.08905775 ]) # D65 target_white = np.array([1.09846607 , 1.00000000 , 0.35582280 ]) # A # 使用CAT02色彩适应模型进行转换 XYZ_adapted = colour.chromatic_adaptation( XYZ, source_white, target_white, method='CAT02' ) print(f"色彩适应后的XYZ值: {XYZ_adapted} " )# 使用CIECAM02色彩外观模型 XYZ = np.array([0.1 , 0.2 , 0.3 ]) XYZ_w = np.array([0.95045593 , 1.00000000 , 1.08905775 ]) L_A = 100
# 环境亮度 Y_b = 20 # 背景亮度 # 计算CIECAM02颜色外观参数 specification = colour.XYZ_to_CIECAM02( XYZ, XYZ_w, L_A, Y_b ) print(f"CIECAM02参数: {specification} " )
2. 光谱处理与分析 许多高级色彩应用需要处理光谱数据而非简单的三刺激值。colour库提供了全面的光谱处理功能,包括光谱到颜色的转换、光谱插值、光谱采样等。这在光学成像、照明设计、材料外观模拟等领域有着广泛应用。
import colourimport numpy as npimport matplotlib.pyplot as plt# 创建一个简单的光谱数据 wavelengths = np.arange(400 , 701 , 10 ) # 400-700nm,步长10nm values = np.random.random(31 ) # 随机生成31个点的光谱数据 # 创建光谱对象 spd = colour.SpectralDistribution(values, wavelengths)# 光谱插值 spd_interpolated = spd.interpolate(colour.SpectralShape(400 , 700 , 5 ))# 计算光谱对应的XYZ值 illuminant = colour.SDS_ILLUMINANTS['D65' ] XYZ = colour.sd_to_XYZ(spd, illuminant) print(f"光谱对应的XYZ值: {XYZ} " )# 绘制光谱曲线 plt.figure(figsize=(10 , 6 )) plt.plot(spd.wavelengths, spd.values, 'r-' , label='原始光谱' ) plt.plot(spd_interpolated.wavelengths, spd_interpolated.values, 'b--' , label='插值后光谱' ) plt.xlabel('波长 (nm)' ) plt.ylabel('光谱功率分布' ) plt.title('光谱数据示例' ) plt.legend() plt.grid(True ) plt.show()
3. 色盲模拟 理解色盲用户的视觉体验对于开发无障碍的视觉设计至关重要。colour库提供了色盲模拟功能,可以转换普通RGB图像以模拟不同类型色盲患者的视觉感知。这对于设计师、开发者创建包容性设计和评估颜色方案的可访问性非常重要。
import colourimport numpy as npfrom colour.plotting import *import matplotlib.pyplot as plt# 创建一个RGB测试图像(这里用简单的色彩方块) RGB = np.array([ [1.0 , 0.0 , 0.0 ], # 红色 [0.0 , 1.0 , 0.0 ], # 绿色 [0.0 , 0.0 , 1.0 ], # 蓝色 [1.0 , 1.0 , 0.0 ], # 黄色 [0.0 , 1.0 , 1.0 ], # 青色 [1.0 , 0.0 , 1.0 ] # 品红色 ])# 转换为色盲视觉下的颜色 # 1. 转换为二色型色盲(绿色色盲)
deuteranopia = colour.anomalous_trichromacy_cmfs_Machado2009('deuteranopia' )(RGB)# 2. 转换为三色型色盲(红色色盲) protanopia = colour.anomalous_trichromacy_cmfs_Machado2009('protanopia' )(RGB)# 3. 转换为蓝色色盲 tritanopia = colour.anomalous_trichromacy_cmfs_Machado2009('tritanopia' )(RGB)# 显示结果 fig, axes = plt.subplots(4 , 1 , figsize=(10 , 8 )) swatches = [RGB, deuteranopia, protanopia, tritanopia] titles = ['原始颜色' , '绿色色盲视觉' , '红色色盲视觉' , '蓝色色盲视觉' ]for i, (swatch, title) in enumerate(zip(swatches, titles)): plot_multi_colour_swatches( colour_swatches=swatch, standalone=False , axes=axes[i] ) axes[i].set_title(title) axes[i].grid(False ) plt.tight_layout() plt.show()
实际应用场景 1. 图像处理与增强 在数字图像处理领域,colour库可以用于高质量的色彩空间转换和色彩校准,帮助开发者实现专业级别的图像处理工作流程。以下示例展示了如何使用colour库对图像进行色彩处理。
import colourimport numpy as npfrom colour.plotting import *import matplotlib.pyplot as pltfrom PIL import Imageimport os# 加载示例图像(这里假设有一个名为'image.jpg'的文件) if os.path.exists('image.jpg' ): image = np.array(Image.open('image.jpg' ).convert('RGB' )) / 255.0 else : # 如果没有图像文件,创建一个示例图像 image = np.zeros((100 , 100 , 3 )) # 创建一个渐变 for i in range(100 ): for j in range(100 ): image[i, j, 0 ] = i / 100.0 image[i, j, 1 ] = j / 100.0 image[i, j, 2 ] = 0.5 # 色彩空间转换 # 1. 将图像从sRGB转换到XYZ XYZ = colour.sRGB_to_XYZ(image)# 2. 将XYZ转换到Lab Lab = colour.XYZ_to_Lab(XYZ)# 3. 提升图像对比度(在Lab空间中操作L通道) Lab_enhanced = Lab.copy()# 增加L通道的对比度 L_min, L_max = Lab[:,:,0 ].min(), Lab[:,:,0 ].max() Lab_enhanced[:,:,0 ] = (Lab[:,:,0 ] - L_min) / (L_max - L_min) * 100 # 4. 将增强后的Lab转回XYZ XYZ_enhanced = colour.Lab_to_XYZ(Lab_enhanced)# 5. 将XYZ转回sRGB RGB_enhanced = colour.XYZ_to_sRGB(XYZ_enhanced)# 修正值范围,确保在[0,1]之间 RGB_enhanced = np.clip(RGB_enhanced, 0 , 1 )# 显示原始图像和增强后的图像 fig, (ax1, ax2) = plt.subplots(1 , 2 , figsize=(12 , 6 )) ax1.imshow(image) ax1.set_title('原始图像' ) ax1.axis('off' ) ax2.imshow(RGB_enhanced) ax2.set_title('增强后的图像' ) ax2.axis('off' ) plt.tight_layout() plt.show()
2. 色彩设计与评估 在产品设计和品牌标识开发中,合理的色彩选择和评估至关重要。colour库可以帮助设计师创建协调的配色方案,并评估不同色彩组合的视觉效果和可访问性。
import colourimport numpy as npimport matplotlib.pyplot as pltfrom colour.plotting import *# 创建一个配色方案 colours = np.array([ [0.75 , 0.25 , 0.20 ], # 主色 [0.20 , 0.50 , 0.75 ], # 次色 [0.90 , 0.80 , 0.20 ], # 强调色 [0.50 , 0.50 , 0.50 ], # 中性色 [0.20 , 0.20 , 0.20 ] # 暗色 ])# 显示配色方案 plot_multi_colour_swatches( colour_swatches=colours, standalone=True )# 评估配色方案的对比度 # 计算主色与其他颜色的CIEDE2000色差 main_colour = colour.sRGB_to_Lab(colours[0 ]) contrast_values = []for i in range(1 , len(colours)): comp_colour = colour.sRGB_to_Lab(colours[i]) delta_E = colour.delta_E(main_colour, comp_colour, method='CIEDE2000' ) contrast_values.append(delta_E) print(f"主色与颜色{i+1 } 的CIEDE2000色差: {delta_E} " )# 评估可访问性 - 模拟色盲视觉下的配色方案 deuteranopia = colour.anomalous_trichromacy_cmfs_Machado2009('deuteranopia' )(colours) fig, (ax1, ax2) = plt.subplots(2 , 1 , figsize=(10 , 6 )) plot_multi_colour_swatches( colour_swatches=colours, standalone=False , axes=ax1 ) ax1.set_title('原始配色方案' ) ax1.grid(False ) plot_multi_colour_swatches( colour_swatches=deuteranopia, standalone=False , axes=ax2 ) ax2.set_title('绿色色盲视觉下的配色方案' ) ax2.grid(False ) plt.tight_layout() plt.show()
总结 Python colour库是一个功能全面、精确可靠的色彩科学计算工具库,为开发者和研究者提供了处理各种色彩问题的专业解决方案。通过本文介绍的基本功能、高级特性和实际应用场景,我们了解了colour库在颜色空间转换、色差计算、色度图生成、色彩适应、光谱处理和色盲模拟等方面的强大能力。无论是进行科学研究、开发专业图像处理应用,还是设计色彩管理系统,colour库都能够提供准确的算法和全面的工具支持。尽管该库的学习曲线相对陡峭,但其提供的专业级功能和对国际标准的全面实现,使其成为色彩科学领域的重要工具。