ColorBase(python-colormath)の完全ガイド:色空間処理の基礎を徹底解説
Python ColorBaseは、python-colormathライブラリの基底クラスで、様々な色空間(Lab、XYZ、RGB等)を扱うクラスの共通機能を提供します。色彩計算や色空間変換を行う際の基盤となる重要なクラスです。
本記事では、Python初心者から中級者まで理解できるよう、ColorBaseの基本概念から実践的な応用例まで詳しく解説します。
ColorBaseとは
ColorBaseは、python-colormathライブラリにおいて、各色空間クラスの共通メソッドと値を保持する基底クラスです。Lab、XYZ、RGB、HSLなど、すべての色空間クラスがこのColorBaseを継承しています。
基本構造
from colormath.color_objects import ColorBase
# ColorBaseは直接インスタンス化せず、継承して使用
python-colormathのインストール
pipでのインストール
pip install colormath
基本的なインポート
from colormath.color_objects import LabColor, XYZColor, sRGBColor
from colormath.color_conversions import convert_color
ColorBaseを継承する主要なクラス
Lab色空間
from colormath.color_objects import LabColor
lab = LabColor(50, 20, -30)
print(lab.get_value_tuple()) # (50.0, 20.0, -30.0)
XYZ色空間
from colormath.color_objects import XYZColor
xyz = XYZColor(0.5, 0.3, 0.2)
print(f"X:{xyz.xyz_x}, Y:{xyz.xyz_y}, Z:{xyz.xyz_z}")
RGB色空間
from colormath.color_objects import sRGBColor
rgb = sRGBColor(0.8, 0.6, 0.4)
print(rgb.get_value_tuple()) # (0.8, 0.6, 0.4)
ColorBaseの主要メソッド
get_value_tuple()メソッド
lab = LabColor(70, 15, -10)
values = lab.get_value_tuple()
print(values) # (70.0, 15.0, -10.0)
色空間変換
from colormath.color_conversions import convert_color
lab = LabColor(50, 20, -30)
xyz = convert_color(lab, XYZColor)
print(f"変換結果: {xyz.get_value_tuple()}")
照明・観測者の設定
lab = LabColor(50, 20, -30, observer='10', illuminant='d65')
print(f"観測者: {lab.observer}, 照明: {lab.illuminant}")
実践的な色変換処理
RGB→Lab変換
from colormath.color_objects import sRGBColor, LabColor
from colormath.color_conversions import convert_color
rgb = sRGBColor(0.8, 0.2, 0.1)
lab = convert_color(rgb, LabColor)
print(f"Lab: L={lab.lab_l:.2f}, a={lab.lab_a:.2f}, b={lab.lab_b:.2f}")
Lab→XYZ変換
lab = LabColor(50, 30, -20)
xyz = convert_color(lab, XYZColor)
print(f"XYZ: X={xyz.xyz_x:.3f}, Y={xyz.xyz_y:.3f}, Z={xyz.xyz_z:.3f}")
複数色の一括変換
colors = [LabColor(30, 10, 5), LabColor(60, -15, 20), LabColor(80, 5, -10)]
xyz_colors = [convert_color(color, XYZColor) for color in colors]
for xyz in xyz_colors:
print(f"XYZ: {xyz.get_value_tuple()}")
画像処理での活用
ピクセル色の変換
def convert_pixel_color(r, g, b):
rgb = sRGBColor(r/255.0, g/255.0, b/255.0)
lab = convert_color(rgb, LabColor)
return lab.lab_l, lab.lab_a, lab.lab_b
# 使用例
l, a, b = convert_pixel_color(128, 64, 192)
print(f"Lab値: L={l:.2f}, a={a:.2f}, b={b:.2f}")
色差の計算
from colormath.color_diff import delta_e_cie2000
color1 = LabColor(50, 2.6, -4.5)
color2 = LabColor(50, 0, -4.0)
delta_e = delta_e_cie2000(color1, color2)
print(f"色差: {delta_e:.2f}")
データ分析での活用
色パレットの分析
def analyze_color_palette(rgb_values):
lab_colors = []
for r, g, b in rgb_values:
rgb = sRGBColor(r, g, b)
lab = convert_color(rgb, LabColor)
lab_colors.append(lab)
return lab_colors
palette = [(255, 0, 0), (0, 255, 0), (0, 0, 255)]
lab_palette = analyze_color_palette(palette)
for lab in lab_palette:
print(f"L={lab.lab_l:.1f}, a={lab.lab_a:.1f}, b={lab.lab_b:.1f}")
色の明度分析
def calculate_brightness(rgb_color):
xyz = convert_color(rgb_color, XYZColor)
return xyz.xyz_y # Y値が明度を表す
rgb = sRGBColor(0.7, 0.3, 0.1)
brightness = calculate_brightness(rgb)
print(f"明度: {brightness:.3f}")
Web開発での活用
CSS色の変換
def hex_to_lab(hex_color):
# 16進数からRGBに変換
hex_color = hex_color.lstrip('#')
r = int(hex_color[0:2], 16) / 255.0
g = int(hex_color[2:4], 16) / 255.0
b = int(hex_color[4:6], 16) / 255.0
rgb = sRGBColor(r, g, b)
return convert_color(rgb, LabColor)
lab = hex_to_lab("#FF6B35")
print(f"Lab: L={lab.lab_l:.1f}, a={lab.lab_a:.1f}, b={lab.lab_b:.1f}")
色のアクセシビリティチェック
def check_contrast(color1_rgb, color2_rgb):
xyz1 = convert_color(color1_rgb, XYZColor)
xyz2 = convert_color(color2_rgb, XYZColor)
l1, l2 = xyz1.xyz_y, xyz2.xyz_y
contrast = (max(l1, l2) + 0.05) / (min(l1, l2) + 0.05)
return contrast
white = sRGBColor(1.0, 1.0, 1.0)
black = sRGBColor(0.0, 0.0, 0.0)
contrast_ratio = check_contrast(white, black)
print(f"コントラスト比: {contrast_ratio:.1f}")
印刷・出版での活用
CMYK変換
from colormath.color_objects import CMYKColor
rgb = sRGBColor(0.8, 0.2, 0.3)
cmyk = convert_color(rgb, CMYKColor)
print(f"CMYK: C={cmyk.cmyk_c:.2f}, M={cmyk.cmyk_m:.2f}, Y={cmyk.cmyk_y:.2f}, K={cmyk.cmyk_k:.2f}")
色域チェック
def check_gamut(lab_color):
try:
rgb = convert_color(lab_color, sRGBColor)
# RGB値が0-1の範囲内かチェック
values = rgb.get_value_tuple()
in_gamut = all(0 <= v <= 1 for v in values)
return in_gamut, values
except:
return False, None
lab = LabColor(50, 80, -60)
in_gamut, rgb_values = check_gamut(lab)
print(f"色域内: {in_gamut}, RGB: {rgb_values}")
科学・研究での活用
分光データの処理
from colormath.color_objects import SpectralColor
# 分光反射率データから色を計算
spectral = SpectralColor(
spec_400nm=0.1, spec_500nm=0.5, spec_600nm=0.8, spec_700nm=0.3
)
xyz = convert_color(spectral, XYZColor)
print(f"分光データからXYZ: {xyz.get_value_tuple()}")
照明条件の比較
def compare_illuminants(lab_color):
# D50とD65照明での比較
lab_d50 = LabColor(lab_color.lab_l, lab_color.lab_a, lab_color.lab_b, illuminant='d50')
lab_d65 = LabColor(lab_color.lab_l, lab_color.lab_a, lab_color.lab_b, illuminant='d65')
xyz_d50 = convert_color(lab_d50, XYZColor)
xyz_d65 = convert_color(lab_d65, XYZColor)
return xyz_d50, xyz_d65
lab = LabColor(60, 15, -20)
xyz_d50, xyz_d65 = compare_illuminants(lab)
エラーハンドリング
変換エラーの処理
from colormath.color_exceptions import UndefinedConversionError
try:
# 無効な変換を試行
invalid_color = LabColor(200, 150, 100) # 範囲外の値
xyz = convert_color(invalid_color, XYZColor)
except UndefinedConversionError as e:
print(f"変換エラー: {e}")
except Exception as e:
print(f"その他のエラー: {e}")
値の検証
def validate_lab_color(l, a, b):
if not (0 <= l <= 100):
raise ValueError(f"L値は0-100の範囲: {l}")
if not (-128 <= a <= 127):
raise ValueError(f"a値は-128-127の範囲: {a}")
if not (-128 <= b <= 127):
raise ValueError(f"b値は-128-127の範囲: {b}")
return LabColor(l, a, b)
try:
valid_lab = validate_lab_color(50, 20, -30)
print("有効なLab色です")
except ValueError as e:
print(f"無効な値: {e}")
パフォーマンス最適化
大量データの処理
import numpy as np
from colormath.color_objects import LabColor, XYZColor
from colormath.color_conversions import convert_color
def batch_convert_colors(lab_data):
"""大量のLab色をXYZに一括変換"""
xyz_results = []
for l, a, b in lab_data:
lab = LabColor(l, a, b)
xyz = convert_color(lab, XYZColor)
xyz_results.append(xyz.get_value_tuple())
return xyz_results
# 使用例
lab_data = [(50, 10, -5), (60, -20, 15), (70, 5, -10)]
xyz_data = batch_convert_colors(lab_data)
メモリ効率の向上
def process_colors_efficiently(color_generator):
"""ジェネレータを使用したメモリ効率的な処理"""
for lab_values in color_generator:
lab = LabColor(*lab_values)
xyz = convert_color(lab, XYZColor)
yield xyz.get_value_tuple()
# 大量データの効率的処理
def color_data_generator():
for i in range(1000):
yield (50 + i*0.1, 10, -5)
for xyz in process_colors_efficiently(color_data_generator()):
# 処理を実行
pass
テストとデバッグ
色変換の精度テスト
def test_color_conversion_accuracy():
# 既知の値でテスト
rgb = sRGBColor(1.0, 0.0, 0.0) # 純粋な赤
lab = convert_color(rgb, LabColor)
rgb_back = convert_color(lab, sRGBColor)
# 元の値と変換後の値を比較
original = rgb.get_value_tuple()
converted = rgb_back.get_value_tuple()
diff = [abs(o - c) for o, c in zip(original, converted)]
print(f"変換誤差: {diff}")
return all(d < 0.01 for d in diff) # 1%以下の誤差
accuracy_ok = test_color_conversion_accuracy()
print(f"変換精度テスト: {'合格' if accuracy_ok else '不合格'}")
デバッグ用ヘルパー関数
def debug_color_info(color):
"""色オブジェクトの詳細情報を表示"""
print(f"クラス: {color.__class__.__name__}")
print(f"値: {color.get_value_tuple()}")
if hasattr(color, 'observer'):
print(f"観測者: {color.observer}")
if hasattr(color, 'illuminant'):
print(f"照明: {color.illuminant}")
lab = LabColor(50, 20, -30, observer='10', illuminant='d65')
debug_color_info(lab)
実際のプロジェクトでの活用例
色管理システム
class ColorManager:
def __init__(self):
self.colors = {}
def add_color(self, name, color_obj):
self.colors[name] = color_obj
def convert_all_to(self, target_space):
converted = {}
for name, color in self.colors.items():
converted[name] = convert_color(color, target_space)
return converted
# 使用例
manager = ColorManager()
manager.add_color("red", sRGBColor(1, 0, 0))
manager.add_color("green", sRGBColor(0, 1, 0))
lab_colors = manager.convert_all_to(LabColor)
品質管理システム
def quality_check_color(target_lab, sample_lab, tolerance=2.0):
"""色の品質チェック"""
from colormath.color_diff import delta_e_cie2000
delta_e = delta_e_cie2000(target_lab, sample_lab)
passed = delta_e <= tolerance
return {
'passed': passed,
'delta_e': delta_e,
'tolerance': tolerance
}
target = LabColor(50, 20, -30)
sample = LabColor(51, 19, -28)
result = quality_check_color(target, sample)
print(f"品質チェック結果: {result}")
まとめ
Python ColorBase(python-colormath)は、様々な色空間を統一的に扱うための強力な基盤クラスです。Lab、XYZ、RGB、CMYKなど多様な色空間間の変換を簡単に実行できます。
重要なポイント:
- すべての色空間クラスの基底クラス
- 統一されたインターフェースによる色空間変換
- 高精度な色彩計算機能
- 画像処理、Web開発、印刷業界での実用性
本記事で紹介した様々な使用例を参考に、実際のプロジェクトでColorBaseを効果的に活用してください。正確な色管理と変換により、より高品質な色彩処理アプリケーションを作成できるでしょう。
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座
