不同颜色空间简介
RGB
三原色*8位(3字节),彩色图,取值范围是[0, 255]。
HSV
由色调(H)、饱和度(S)、亮度(V)三通道组成,取值范围分别是[0, 360°],[0, 1],[0, 1]。
在OpenCV中,使用cv2.cvtColor转换颜色空间,HSV的取值范围分别是[0, 180°],[0, 255],[0, 255]。
而在Windows画图等取色工具中,HSV通道的取值范围均被定义为[0, 240],每单位H代表1.5°。
Lab
由明亮度(L*)、红绿(a*)、黄蓝(b*)三通道组成,取值范围分别是[0,100],[127,-128],[127,-128]。
L*——表示明度,范围由0到100,表示颜色从深(黑)到浅(白)。
a*——表示红绿,数值变化由正到负,表示颜色从红(正)到绿(负)。
b*——表示黄蓝,数值变化由正到负,表示颜色从黄(正)到蓝(负)。
参考:https://zhuanlan.zhihu.com/p/32440084
Lab是CIE组织确定的一个理论上包括了人眼可以看见的所有色彩的色彩模式,也是一种基于生理特征的颜色系统,它是用数字化的方法来描述人的视觉感应。
更多可以了解这家公司:X-Rite,Pantone(彩通公司),专门开发和研究色彩,爱色丽;色容差是什么?
详见早期文章:cv2函数原型-图像基础(OpenCV规约,读写/颜色转换/图像压缩/颜色空间)
定义人眼对色差的容忍度(ΔE*)
参考:Delta E, Delta E 76, Delta E 94, Delta E 2000
使用skimage实现色差度量
注意点:
- 数据类型必须是uint8,
- 可以是高维矩阵(直接计算两张图逐像素对应位置的色差),
- deltaE_cie76具有互反性:deltaE_cie76(lab1, lab2) == deltaE_cie76(lab2, lab1)
代码:
# -*- coding:utf-8 -*-
"""
@Info : 2024/5/26 10:00 PyCharm
@Desc :
"""
import numpy as np
from skimage.color import rgb2lab
from skimage.color.delta_e import deltaE_cie76
rgb1, rgb2 = (255, 0, 0), (0, 0, 255) # 红、蓝,差异大
lab1 = rgb2lab(np.uint8(rgb1)) # (3,) 一定要是uint8
lab2 = rgb2lab(np.uint8(rgb2)) # (3,) 一定要是uint8
diff = deltaE_cie76(lab1, lab2)
print(lab1, "\n", lab2, "颜色之间的差异值:", diff) # float number: 176.3108991541805
rgb1, rgb2 = (150, 80, 51), (140, 82, 55) # 差异小
lab1 = rgb2lab(np.uint8(rgb1)) # (3,) 一定要是uint8
lab2 = rgb2lab(np.uint8(rgb2)) # (3,) 一定要是uint8
diff = deltaE_cie76(lab1, lab2)
print(lab1, "\n", lab2, "颜色之间的差异值:", diff) # float number: 6.412575298468073
rgb1, rgb2 = (150, 80, 51), (140, 82, 55) # 差异小
lab1 = rgb2lab(np.array(rgb1)) # (3,) float(计算异常)
lab2 = rgb2lab(np.array(rgb2)) # (3,) float(计算异常)
diff = deltaE_cie76(lab1, lab2)
print(lab1, "\n", lab2, "颜色之间的差异值:", diff) # float number: 4.054784786919019e-07(计算异常)
# 验证:deltaE_cie76(lab1, lab2) == deltaE_cie76(lab2, lab1)
rgb1 = [[150, 80, 51], [140, 82, 55]]
rgb2 = [[140, 82, 55], [150, 80, 51]]
lab1 = rgb2lab(np.uint8([rgb1])) # (1,2,3) 一定要是uint8
lab2 = rgb2lab(np.uint8([rgb2])) # (1,2,3) 一定要是uint8
diff = deltaE_cie76(lab1, lab2)
print(lab1, "\n", lab2, "颜色之间的差异值:", diff) # numpy.ndarray (1,2): [[6.4125753 6.4125753]]
输出结果:
[53.24058794 80.09230823 67.20275104]
[ 32.29567257 79.18559091 -107.85730021] 颜色之间的差异值: 176.3108991541805
[41.94133775 26.58908326 29.78323 ]
[41.03640179 21.4599747 26.04231324] 颜色之间的差异值: 6.412575298468073
[3.02103672e-06 1.69462457e-06 2.06929996e-06]
[3.00776303e-06 1.35502505e-06 1.84814667e-06] 颜色之间的差异值: 4.054784786919019e-07
[[[41.94133775 26.58908326 29.78323 ]
[41.03640179 21.4599747 26.04231324]]]
[[[41.03640179 21.4599747 26.04231324]
[41.94133775 26.58908326 29.78323 ]]] 颜色之间的差异值: [[6.4125753 6.4125753]]