【python】RGB色彩空间转Lab色彩空间

用于检验的网站:颜色空间转换 - 在线工具 (buyaocha.com) 

单个输入

import numpy as np

def rgb_to_xyz(rgb):
    # 将RGB值转换为XYZ空间
    rgb = np.array(rgb) / 255.0
    rgb = np.where(rgb <= 0.04045, rgb / 12.92, ((rgb + 0.055) / 1.055) ** 2.4)
    
    rgb = rgb.reshape((1, 1, 3))

    m = np.array([[0.4124564, 0.3575761, 0.1804375],
                  [0.2126729, 0.7151522, 0.0721750],
                  [0.0193339, 0.1191920, 0.9503041]])

    xyz = np.dot(rgb, m.T)
    return xyz

def xyz_to_lab(xyz):
    # 将XYZ值转换为Lab空间
    xyz_ref = np.array([0.950456, 1.0, 1.088754])
    
    xyz_ratio = xyz / xyz_ref
    xyz_ratio = np.where(xyz_ratio > 0.008856, xyz_ratio ** (1/3), (903.3 * xyz_ratio + 16) / 116)
    
    lab = np.zeros_like(xyz)
    lab[..., 0] = np.clip(116 * xyz_ratio[..., 1] - 16, 0, 100)
    lab[..., 1] = (xyz_ratio[..., 0] - xyz_ratio[..., 1]) * 500
    lab[..., 2] = (xyz_ratio[..., 1] - xyz_ratio[..., 2]) * 200
    
    return lab

def rgb_to_lab(rgb):
    xyz = rgb_to_xyz(rgb)
    lab = xyz_to_lab(xyz)
    return lab

# 输入RGB颜色值
rgb_color = [255, 0, 0]  # 例如,红色

# 转换为Lab颜色
lab_color = rgb_to_lab(rgb_color)

# 打印结果
print("RGB颜色:", rgb_color)
print("Lab颜色:", lab_color)

 excel输入

excel大概长这样:

R_meanG_meanB_meanLabel
221.5172.751900
220.75164193.750
244.75179195.750
246.75172.75196.750
245148.5172.25

0 

import pandas as pd
import numpy as np


def rgb_to_lab(rgb):
    # 将RGB值转换为Lab空间
    rgb = np.array(rgb) / 255.0
    rgb = np.where(rgb <= 0.04045, rgb / 12.92, ((rgb + 0.055) / 1.055) ** 2.4)

    m = np.array([[0.4124564, 0.3575761, 0.1804375],
                  [0.2126729, 0.7151522, 0.0721750],
                  [0.0193339, 0.1191920, 0.9503041]])

    xyz = np.dot(rgb, m.T)

    xyz_ref = np.array([0.950456, 1.0, 1.088754])

    xyz_ratio = xyz / xyz_ref
    xyz_ratio = np.where(xyz_ratio > 0.008856, xyz_ratio ** (1 / 3), (903.3 * xyz_ratio + 16) / 116)

    lab = np.zeros_like(xyz_ratio)
    lab[..., 0] = np.clip(116 * xyz_ratio[..., 1] - 16, 0, 100)
    lab[..., 1] = (xyz_ratio[..., 0] - xyz_ratio[..., 1]) * 500
    lab[..., 2] = (xyz_ratio[..., 1] - xyz_ratio[..., 2]) * 200

    return lab


# 读取Excel文件
excel_file_path = './exel/data_all.xlsx'  # 输入地址
df = pd.read_excel(excel_file_path)

# 转换RGB到Lab,并添加到DataFrame
lab_values = df[['R_mean', 'G_mean', 'B_mean']].apply(lambda row: rgb_to_lab(row), axis=1)
df[['Lab_L', 'Lab_a', 'Lab_b']] = pd.DataFrame(lab_values.tolist(), index=df.index)

# 保存结果回Excel文件
output_excel_path = './exel/CIE Lab/data_all_lab.xlsx'  # 输出地址
df.to_excel(output_excel_path, index=False)

print("转换完成,Lab值保存在", output_excel_path)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值