OpenCV  4.10.0
开源计算机视觉
正在加载...
正在搜索...
无匹配
| 枚举
颜色校正模型

详细说明

简介

颜色校正的目的是调整输入和输出设备的颜色响应到已知的稳定状态。被校准的设备有时称为校准源;用作标准的颜色空间有时称为校准目标。颜色校正在许多行业中得到了应用,如电视制作、游戏、摄影、工程、化学、医药等。由于输入和输出设备的制造工艺,通道响应存在非线性失真。为了正确校正设备输出的图像,有必要校准捕获的颜色和实际颜色。

class  cv::ccm::ColorCorrectionModel
 ccm模型的核心类。更多...
 

枚举

enum  cv::ccm::CCM_TYPE {
  cv::ccm::CCM_3x3 ,
  cv::ccm::CCM_4x3
}
 ccm可能类型的枚举。更多...
 
enum  cv::ccm::COLOR_SPACE {
  cv::ccm::COLOR_SPACE_sRGB ,
  cv::ccm::COLOR_SPACE_sRGBL ,
  cv::ccm::COLOR_SPACE_AdobeRGB ,
  cv::ccm::COLOR_SPACE_AdobeRGBL ,
  cv::ccm::COLOR_SPACE_WideGamutRGB ,
  cv::ccm::COLOR_SPACE_WideGamutRGBL ,
  cv::ccm::COLOR_SPACE_ProPhotoRGB ,
  cv::ccm::COLOR_SPACE_ProPhotoRGBL ,
  cv::ccm::COLOR_SPACE_DCI_P3_RGB ,
  cv::ccm::COLOR_SPACE_DCI_P3_RGBL ,
  cv::ccm::COLOR_SPACE_AppleRGB ,
  cv::ccm::COLOR_SPACE_AppleRGBL ,
  cv::ccm::COLOR_SPACE_REC_709_RGB ,
  cv::ccm::COLOR_SPACE_REC_709_RGBL ,
  cv::ccm::COLOR_SPACE_REC_2020_RGB ,
  cv::ccm::COLOR_SPACE_REC_2020_RGBL ,
  cv::ccm::COLOR_SPACE_XYZ_D65_2 ,
  cv::ccm::COLOR_SPACE_XYZ_D65_10 ,
  cv::ccm::COLOR_SPACE_XYZ_D50_2 ,
  cv::ccm::COLOR_SPACE_XYZ_D50_10 ,
  cv::ccm::COLOR_SPACE_XYZ_A_2 ,
  cv::ccm::COLOR_SPACE_XYZ_A_10 ,
  cv::ccm::COLOR_SPACE_XYZ_D55_2 ,
  cv::ccm::COLOR_SPACE_XYZ_D55_10 ,
  cv::ccm::COLOR_SPACE_XYZ_D75_2 ,
  cv::ccm::COLOR_SPACE_XYZ_D75_10 ,
  cv::ccm::COLOR_SPACE_XYZ_E_2 ,
  cv::ccm::COLOR_SPACE_XYZ_E_10 ,
  cv::ccm::COLOR_SPACE_Lab_D65_2 ,
  cv::ccm::COLOR_SPACE_Lab_D65_10 ,
  cv::ccm::COLOR_SPACE_Lab_D50_2 ,
  cv::ccm::COLOR_SPACE_Lab_D50_10 ,
  cv::ccm::COLOR_SPACE_Lab_A_2 ,
  cv::ccm::COLOR_SPACE_Lab_A_10 ,
  cv::ccm::COLOR_SPACE_Lab_D55_2 ,
  cv::ccm::COLOR_SPACE_Lab_D55_10 ,
  cv::ccm::COLOR_SPACE_Lab_D75_2 ,
  cv::ccm::COLOR_SPACE_Lab_D75_10 ,
  cv::ccm::COLOR_SPACE_Lab_E_2 ,
  cv::ccm::COLOR_SPACE_Lab_E_10
}
 
enum  cv::ccm::CONST_COLOR {
  cv::ccm::COLORCHECKER_Macbeth ,
  cv::ccm::COLORCHECKER_Vinyl ,
  cv::ccm::COLORCHECKER_DigitalSG
}
 麦氏和乙烯基色卡,带有2度D50。《a href="../../de/df4/group__color__correction.html#ga9550427e0c935010355bbbd7d4569836">更多...
 
enum  cv::ccm::DISTANCE_TYPE {
  cv::ccm::DISTANCE_CIE76 ,
  cv::ccm::DISTANCE_CIE94_GRAPHIC_ARTS ,
  cv::ccm::DISTANCE_CIE94_TEXTILES ,
  cv::ccm::DISTANCE_CIE2000 ,
  cv::ccm::DISTANCE_CMC_1TO1 ,
  cv::ccm::DISTANCE_CMC_2TO1 ,
  cv::ccm::DISTANCE_RGB ,
  cv::ccm::DISTANCE_RGBL
}
 计算颜色之间的距离可能使用的函数的枚举。更多...
 
enum  cv::ccm::INITIAL_METHOD_TYPE {
  cv::ccm::INITIAL_METHOD_WHITE_BALANCE ,
  cv::ccm::INITIAL_METHOD_LEAST_SQUARE
}
 初始方法可能的类型的枚举。更多...
 
enum  cv::ccm::LINEAR_TYPE {
  cv::ccm::LINEARIZATION_IDENTITY ,
  cv::ccm::LINEARIZATION_GAMMA ,
  cv::ccm::LINEARIZATION_COLORPOLYFIT ,
  cv::ccm::LINEARIZATION_COLORLOGPOLYFIT ,
  cv::ccm::LINEARIZATION_GRAYPOLYFIT ,
  cv::ccm::LINEARIZATION_GRAYLOGPOLYFIT
}
 线性化转换类型。更多...
 

枚举类型文档

◆ CCM_TYPE

#include <opencv2/mcc/ccm.hpp>

ccm可能类型的枚举。

枚举值
CCM_3x3 
Python: cv.ccm.CCM_3x3

形状为 \(3\times3\) 的色域校正矩阵(CCM)对颜色值进行线性变换。

CCM_4x3 
Python: cv.ccm.CCM_4x3

形状为 \(4\times3\) 的色域校正矩阵(CCM)执行仿射变换。

◆ COLOR_SPACE

#include <opencv2/mcc/ccm.hpp>

枚举值
COLOR_SPACE_sRGB 
Python: cv.ccm.COLOR_SPACE_sRGB

https://en.wikipedia.org/wiki/SRGB , 红绿蓝(RGB)颜色空间

COLOR_SPACE_sRGBL 
Python: cv.ccm.COLOR_SPACE_sRGBL

https://en.wikipedia.org/wiki/SRGB , 线性红绿蓝(RGB)颜色空间

COLOR_SPACE_AdobeRGB 
Python: cv.ccm.COLOR_SPACE_AdobeRGB

https://en.wikipedia.org/wiki/Adobe_RGB_color_space , 红绿蓝(RGB)颜色空间

COLOR_SPACE_AdobeRGBL 
Python: cv.ccm.COLOR_SPACE_AdobeRGBL

https://en.wikipedia.org/wiki/Adobe_RGB_color_space , 线性红绿蓝(RGB)颜色空间

COLOR_SPACE_WideGamutRGB 
Python: cv.ccm.COLOR_SPACE_WideGamutRGB

https://en.wikipedia.org/wiki/Wide-gamut_RGB_color_space , 红绿蓝(RGB)颜色空间

COLOR_SPACE_WideGamutRGBL 
Python: cv.ccm.COLOR_SPACE_WideGamutRGBL

https://en.wikipedia.org/wiki/Wide-gamut_RGB_color_space , 线性红绿蓝(RGB)颜色空间

COLOR_SPACE_ProPhotoRGB 
Python: cv.ccm.COLOR_SPACE_ProPhotoRGB

https://en.wikipedia.org/wiki/ProPhoto_RGB_color_space , 红绿蓝(RGB)颜色空间

COLOR_SPACE_ProPhotoRGBL 
Python: cv.ccm.COLOR_SPACE_ProPhotoRGBL

https://en.wikipedia.org/wiki/ProPhoto_RGB_color_space , 线性红绿蓝(RGB)颜色空间

COLOR_SPACE_DCI_P3_RGB 
Python: cv.ccm.COLOR_SPACE_DCI_P3_RGB

https://en.wikipedia.org/wiki/DCI-P3 , 红绿蓝(RGB)颜色空间

COLOR_SPACE_DCI_P3_RGBL 
Python: cv.ccm.COLOR_SPACE_DCI_P3_RGBL

https://en.wikipedia.org/wiki/DCI-P3 , 线性红绿蓝(RGB)颜色空间

COLOR_SPACE_AppleRGB 
Python: cv.ccm.COLOR_SPACE_AppleRGB

https://en.wikipedia.org/wiki/RGB_color_space , 红绿蓝(RGB)颜色空间

COLOR_SPACE_AppleRGBL 
Python: cv.ccm.COLOR_SPACE_AppleRGBL

https://en.wikipedia.org/wiki/RGB_color_space , 线性红绿蓝(RGB)颜色空间

COLOR_SPACE_REC_709_RGB 
Python: cv.ccm.COLOR_SPACE_REC_709_RGB

https://en.wikipedia.org/wiki/Rec._709 , 红绿蓝(RGB)颜色空间

COLOR_SPACE_REC_709_RGBL 
Python: cv.ccm.COLOR_SPACE_REC_709_RGBL

https://en.wikipedia.org/wiki/Rec._709 , 线性红绿蓝(RGB)颜色空间

COLOR_SPACE_REC_2020_RGB 
Python: cv.ccm.COLOR_SPACE_REC_2020_RGB

https://en.wikipedia.org/wiki/Rec._2020 , 红绿蓝(RGB)颜色空间

COLOR_SPACE_REC_2020_RGBL 
Python: cv.ccm.COLOR_SPACE_REC_2020_RGBL

https://zh.wikipedia.org/wiki/Rec._2020 ,线性RGB色彩空间

COLOR_SPACE_XYZ_D65_2 
Python: cv.ccm.COLOR_SPACE_XYZ_D65_2

https://zh.wikipedia.org/wiki/CIE_1931_color_space ,非RGB色彩空间

COLOR_SPACE_XYZ_D65_10 
Python: cv.ccm.COLOR_SPACE_XYZ_D65_10

非RGB色彩空间

COLOR_SPACE_XYZ_D50_2 
Python: cv.ccm.COLOR_SPACE_XYZ_D50_2

非RGB色彩空间

COLOR_SPACE_XYZ_D50_10 
Python: cv.ccm.COLOR_SPACE_XYZ_D50_10

非RGB色彩空间

COLOR_SPACE_XYZ_A_2 
Python: cv.ccm.COLOR_SPACE_XYZ_A_2

非RGB色彩空间

COLOR_SPACE_XYZ_A_10 
Python: cv.ccm.COLOR_SPACE_XYZ_A_10

非RGB色彩空间

COLOR_SPACE_XYZ_D55_2 
Python: cv.ccm.COLOR_SPACE_XYZ_D55_2

非RGB色彩空间

COLOR_SPACE_XYZ_D55_10 
Python: cv.ccm.COLOR_SPACE_XYZ_D55_10

非RGB色彩空间

COLOR_SPACE_XYZ_D75_2 
Python: cv.ccm.COLOR_SPACE_XYZ_D75_2

非RGB色彩空间

COLOR_SPACE_XYZ_D75_10 
Python: cv.ccm.COLOR_SPACE_XYZ_D75_10

非RGB色彩空间

COLOR_SPACE_XYZ_E_2 
Python: cv.ccm.COLOR_SPACE_XYZ_E_2

非RGB色彩空间

COLOR_SPACE_XYZ_E_10 
Python: cv.ccm.COLOR_SPACE_XYZ_E_10

非RGB色彩空间

COLOR_SPACE_Lab_D65_2 
Python: cv.ccm.COLOR_SPACE_Lab_D65_2

https://zh.wikipedia.org/wiki/CIELAB_color_space ,非RGB色彩空间

COLOR_SPACE_Lab_D65_10 
Python: cv.ccm.COLOR_SPACE_Lab_D65_10

非RGB色彩空间

COLOR_SPACE_Lab_D50_2 
Python: cv.ccm.COLOR_SPACE_Lab_D50_2

非RGB色彩空间

COLOR_SPACE_Lab_D50_10 
Python: cv.ccm.COLOR_SPACE_Lab_D50_10

非RGB色彩空间

COLOR_SPACE_Lab_A_2 
Python: cv.ccm.COLOR_SPACE_Lab_A_2

非RGB色彩空间

COLOR_SPACE_Lab_A_10 
Python: cv.ccm.COLOR_SPACE_Lab_A_10

非RGB色彩空间

COLOR_SPACE_Lab_D55_2 
Python: cv.ccm.COLOR_SPACE_Lab_D55_2

非RGB色彩空间

COLOR_SPACE_Lab_D55_10 
Python: cv.ccm.COLOR_SPACE_Lab_D55_10

非RGB色彩空间

COLOR_SPACE_Lab_D75_2 
Python: cv.ccm.COLOR_SPACE_Lab_D75_2

非RGB色彩空间

COLOR_SPACE_Lab_D75_10 
Python: cv.ccm.COLOR_SPACE_Lab_D75_10

非RGB色彩空间

COLOR_SPACE_Lab_E_2 
Python: cv.ccm.COLOR_SPACE_Lab_E_2

非RGB色彩空间

COLOR_SPACE_Lab_E_10 
Python: cv.ccm.COLOR_SPACE_Lab_E_10

非RGB色彩空间

◆ CONST_COLOR

#include <opencv2/mcc/ccm.hpp>

Macbeth和Vinyl ColorChecker配合2deg D50。

枚举值
COLORCHECKER_Macbeth 
Python: cv.ccm.COLORCHECKER_Macbeth

Macbeth ColorChecker。

COLORCHECKER_Vinyl 
Python: cv.ccm.COLORCHECKER_Vinyl

DKK ColorChecker。

COLORCHECKER_DigitalSG 
Python: cv.ccm.COLORCHECKER_DigitalSG

DigitalSG ColorChecker,包含140个方块。

◆ DISTANCE_TYPE

#include <opencv2/mcc/ccm.hpp>

计算颜色之间距离的可能函数枚举。

参见https://en.wikipedia.org/wiki/Color_difference获取详细信息

枚举值
DISTANCE_CIE76 
Python: cv.ccm.DISTANCE_CIE76

1976的公式是将测量到的颜色差异与已知的CIELAB坐标集相关联的第一个公式。

DISTANCE_CIE94_GRAPHIC_ARTS 
Python: cv.ccm.DISTANCE_CIE94_GRAPHIC_ARTS

1976的定义被扩展以解决感知的非均匀性。

DISTANCE_CIE94_TEXTILES 
Python: cv.ccm.DISTANCE_CIE94_TEXTILES
DISTANCE_CIE2000 
Python: cv.ccm.DISTANCE_CIE2000
DISTANCE_CMC_1TO1 
Python: cv.ccm.DISTANCE_CMC_1TO1

在1984年,染色者与色素学家协会的色彩测量委员会定义了一个基于L*C*h颜色模型的差异度量。

DISTANCE_CMC_2TO1 
Python: cv.ccm.DISTANCE_CMC_2TO1
DISTANCE_RGB 
Python: cv.ccm.DISTANCE_RGB

rgb颜色空间的欧几里得距离。

DISTANCE_RGBL 
Python: cv.ccm.DISTANCE_RGBL

rgbl颜色空间的欧几里得距离。

◆ INITIAL_METHOD_TYPE

#include <opencv2/mcc/ccm.hpp>

初始方法的可能类型枚举。

枚举值
INITIAL_METHOD_WHITE_BALANCE 
Python: cv.ccm.INITIAL_METHOD_WHITE_BALANCE

白平衡方法。初始值为

INITIAL_METHOD_LEAST_SQUARE 
Python: cv.ccm.INITIAL_METHOD_LEAST_SQUARE

最小二乘法是在线性RGB距离函数下的一种最优解

\( M_{CCM}= \begin{bmatrix} k_R & 0 & 0\\ 0 & k_G & 0\\ 0 & 0 & k_B\\ \end{bmatrix} \)
其中
\( k_R=mean(R_{li}')/mean(R_{li})\\ k_R=mean(G_{li}')/mean(G_{li})\\ k_R=mean(B_{li}')/mean(B_{li}) \)

◆ LINEAR_TYPE

#include <opencv2/mcc/ccm.hpp>

线性化变换类型。

色彩校正的第一步是对检测到的色彩进行线性化。由于输入的色彩空间尚未校准,我们通常使用一些经验方法来进行线性化。常见的线性化方法有几种。第一种是相同变换,第二种是gamma校正,第三种是多项式拟合。

线性化通常是一个逐元素函数。数学符号如下:

\(C\): 色彩的任意通道,可以是 \(R, G\) 或 \(B\)。

\(R, G, B\): 分别表示 \(R, G, B\) 通道。

\(G\): 灰度;

\(s,sl\): 下标,表示检测到的数据和其线性化值,前者是输入,后者是输出;

\(d,dl\): 下标,表示参考数据和其线性化值。

相同变换

在相同变换线性化过程中,通常不进行任何变化,这是因为输入RGB图像的三刺激值已经与亮度成比例。例如,如果输入测量数据是RAW格式,测量数据已经是线性的,因此不需要进行线性化。

相同变换的公式如下

\( C_{sl}=C_s \)

Gamma校正

Gamma校正是一种在RGB空间中进行非线性处理的方法,有关详细信息,请参阅色彩空间文档。在线性化部分,通常将 \(\gamma\) 的值设置为2.2。也可以自定义该值。

gamma校正线性化的公式如下

\( C_{sl}=C_s^{\gamma},\qquad C_s\ge0\\ C_{sl}=-(-C_s)^{\gamma},\qquad C_s<0 \)

多项式拟合

多项式拟合使用多项式进行线性化。假设多项式是

\( f(x)=a_nx^n+a_{n-1}x^{n-1}+...+a_0 \)

那么

\( C_{sl}=f(C_s) \)

在实践中,为了防止过拟合,通常使用 \( n\le3 \)。

多项式拟合有很多变体,区别在于 \( f(x) \) 的生成方式。通常需要使用线性化参考色彩和相应的检测色彩来计算多项式参数。但是,并非所有色彩都参与计算。需要移除饱和度检测色彩。具体算法细节请参阅算法介绍文档。

分别拟合通道

使用三个多项式,\( r(x), g(x), b(x) \),对RGB色彩空间的每个通道进行线性化[1-3]

\( R_{sl}=r(R_s)\\ G_{sl}=g(G_s)\\ B_{sl}=b(B_s)\\ \)

多项式是通过最小化检测数据和线性化参考数据之间的残差平方和来生成的。以R通道为例

\( R=\arg min_{f}(\Sigma(R_{dl}-f(R_S)^2) \)

这等价于求解下面的方程组的最小二乘回归

\( f(R_{s1})=R_{dl1}\\ f(R_{s2})=R_{dl2}\\ ... \)

使用多项式后,上面的方程变为

\( \begin{bmatrix} R_{s1}^{n} & R_{s1}^{n-1} & ... & 1\\ R_{s2}^{n} & R_{s2}^{n-1} & ... & 1\\ ... & ... & ... & ... \end{bmatrix} \begin{bmatrix} a_{n}\\ a_{n-1}\\ ... \\ a_0 \end{bmatrix} = \begin{bmatrix} R_{dl1}\\ R_{dl2}\\ ... \end{bmatrix} \)

它可以表示为一个线性方程组

\( AX=B \)

当参考颜色的数量不小于多项式的度时,线性系统有最小二乘解

\( X=(A^TA)^{-1}A^TB \)

一旦我们得到了多项式系数,我们就可以得到多项式 \( r \)。

可以通过numpy中的 numpy.polyfit 来实现寻找多项式系数的方法,在这里表示为

\( R=polyfit(R_S, R_{dl}) \)

请注意,通常我们想得到的多项式在区间 [0,1] 上是单调递增的,但这意味着需要非线性方法来生成多项式(详细内容见[4])。这将大大增加程序的复杂性。考虑到单调性不会影响颜色校正程序的正常运作,仍然使用 polyfit 来实现程序。

其他通道的参数也可以以相似的方式推导。

灰度多项式拟合

在这种方法[2]中,对所有通道使用单个多项式。多项式仍然是基于检测到的颜色到线性参考颜色的 polyfit 结果。然而,只有参考颜色的灰度可以参与计算。

由于对应于参考颜色灰度的检测颜色不一定为灰度,需要将其灰度化。灰度是指 XYZ 颜色空间的 Y 通道。检测数据的空间不明确,无法转换为 XYZ 空间。因此,使用 sRGB 公式进行近似[5]。

\[ G_{s}=0.2126R_{s}+0.7152G_{s}+0.0722B_{s} \]

然后可以通过使用 polyfit 获取多项式参数。

\[ f=polyfit(G_{s}, G_{dl}) \]

获得 \(f\) 后,可以进行线性化。

对数多项式拟合

对于伽玛校正公式,我们取对数

\[ ln(C_{sl})={\gamma}ln(C_s),\qquad C_s\ge0\ \]

可以看出,\(ln(C_s)\) 与 \(ln(C_{sl})\) 之间存在线性关系。可以认为该公式是多项式关系的近似,即存在一个多项式 \(f\),使得[2]

\[ ln(C_{sl})=f(ln(C_s)), \qquad C_s>0\\ C_{sl}=0, \qquad C_s=0 \]

因为 \(exp(ln(0))\to\infty \),上述公式中直接将分量为 0 的通道映射为 0。

对于单独拟合通道,我们有

\[ r=polyfit(ln(R_s),ln(R_{dl}))\\ g=polyfit(ln(G_s),ln(G_{dl}))\\ b=polyfit(ln(B_s),ln(B_{dl}))\\ \]

请注意,\(ln(*)\) 的参数不能为 0。因此,我们需要从 \(R_s\) 和 \(R_{dl}\),\(G_s\) 和 \(G_{dl}\),\(B_s\) 和 \(B_{dl}\) 中删除值等于 0 的通道。

因此

\[ ln(R_{sl})=r(ln(R_s)), \qquad R_s>0\\ R_{sl}=0, \qquad R_s=0\\ ln(G_{sl})=g(ln(G_s)),\qquad G_s>0\\ G_{sl}=0, \qquad G_s=0\\ ln(B_{sl})=b(ln(B_s)),\qquad B_s>0\\ B_{sl}=0, \qquad B_s=0\\ \]

对于灰度多项式,也有

\[ f=polyfit(ln(G_{sl}),ln(G_{dl})) \]

\[ ln(C_{sl})=f(ln(C_s)), \qquad C_s>0\\ C_sl=0, \qquad C_s=0 \]

枚举值
LINEARIZATION_IDENTITY 
Python: cv.ccm.LINEARIZATION_IDENTITY

不进行更改

LINEARIZATION_GAMMA 
Python: cv.ccm.LINEARIZATION_GAMMA

伽玛校正;需要同时分配一个值给伽玛

LINEARIZATION_COLORPOLYFIT 
Python: cv.ccm.LINEARIZATION_COLORPOLYFIT

分别对通道进行多项式拟合;需要同时分配一个值给 deg

LINEARIZATION_COLORLOGPOLYFIT 
Python: cv.ccm.LINEARIZATION_COLORLOGPOLYFIT

分别对通道进行对数多项式拟合;需要同时分配一个值给 deg

LINEARIZATION_GRAYPOLYFIT 
Python: cv.ccm.LINEARIZATION_GRAYPOLYFIT

灰度多项式拟合;需要同时分配一个值给 deg 和 dst_whites

线性化_GRAYLOGPOLYFIT 
Python: cv.ccm.LINEARIZATION_GRAYLOGPOLYFIT

灰度对数多项式拟合;需要同时为deg和dst_whites分配一个值