cv2传统方法-使用不同颜色空间度量色差

不同颜色空间简介

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组织确定的一个理论上包括了人眼可以看见的所有色彩的色彩模式,也是一种基于生理特征的颜色系统,它是用数字化的方法来描述人的视觉感应。

CIELab

更多可以了解这家公司:X-Rite,Pantone(彩通公司),专门开发和研究色彩,爱色丽色容差是什么?

详见早期文章:cv2函数原型-图像基础(OpenCV规约,读写/颜色转换/图像压缩/颜色空间)

定义人眼对色差的容忍度(ΔE*)

参考:Delta E, Delta E 76, Delta E 94, Delta E 2000

色差范围以及人眼感官区分度

使用skimage实现色差度量

注意点:

  1. 数据类型必须是uint8,
  2. 可以是高维矩阵(直接计算两张图逐像素对应位置的色差),
  3. 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]]
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值