假设我们在一个图像中有5个圆的l,a,b值。这些值是使用OpenCV计算的。

imlab=cv2.cvtColor(circle_img_only,cv2.COLOR_BGR2LAB).astype("float32")

实际上,我们从每个圆中获取100个随机像素,然后为每个圆计算正常的平均LAB值(我不确定这是正确的方法)

值是np.array,类似于以下内容:
LAB Measured Colors Values =
[[ 27.553 -26.39    7.13 ]
 [ 28.357 -27.08    7.36 ]
 [ 28.365 -27.01    7.21 ]
 [ 29.749 -27.78    7.42 ]
 [ 28.478 -26.81    7.14 ]]

这些圆也使用比色计仪器测量。比色计产生引用值。
LAB Reference Colors Values =
[35.07, -24.95, 3.12]
[35.09, -24.95, 3.18]
[35.0, -25.6, 3.21]
[34.97, -25.76, 3.36]
[35.38, -24.55, 2.9]

让我们将LAB测量的颜色值称为m1
让我们将LAB引用颜色值称为m2

我们有测量值和引用值。
我们如何计算CCM-色彩校正矩阵?

我使用以下方法做到这一点:
def first_order_colour_fit(m_1, m_2 , rcond=1):

"""
Colour Fitting
==============

Performs a first order colour fit from given :math:`m_1` colour array to
:math:`m_2` colour array. The resulting colour fitting matrix is computed
using multiple linear regression.

The purpose of that object is for example the matching of two
*ColorChecker* colour rendition charts together

Parameters
----------
m_1 : array_like, (3, n)
    Test array :math:`m_1` to fit onto array :math:`m_2`.
m_2 : array_like, (3, n)
    Reference array the array :math:`m_1` will be colour fitted against.


Simply: Creating and clculating CCM - Color Correction Matrix
"""



print('CCM - Color Correction Matrix = ')
ColorCorrectionMatrix = np.transpose(np.linalg.lstsq(m_1, m_2 , rcond)[0])

这将产生:
CCM - Color Correction Matrix =
[[-0.979 -2.998 -2.434]
 [ 0.36   1.467  0.568]
 [ 0.077  0.031  0.241]]

取得CCM之后-我想在m1(LAB实测颜色)上应用CCM,并进行更正。

我们该怎么做?

我正在执行以下操作,但是结果似乎不正确:
def CorrectedMeasuredLABValues(measured_colors_by_app , ColorCorrectionMatrix , reference_LAB_colors_values ):

CorrectedMeasured_LAB_Values = np.zeros_like(measured_colors_by_app , dtype=object)


print('\n\n\n\n Corrected Measured LAB Values Matrix = ')
for i in range(measured_colors_by_app.shape[0]):
    print(ColorCorrectionMatrix.dot(measured_colors_by_app[i]))
    CorrectedMeasured_LAB_Values[i] = ColorCorrectionMatrix.dot(measured_colors_by_app[i])

我们得到以下内容:
 Corrected Measured LAB Values Matrix =
[ 34.766 -24.742   3.033]
[ 35.487 -25.334   3.129]
[ 35.635 -25.314   3.096]
[ 36.076 -25.825   3.23 ]
[ 35.095 -25.019   3.094]

最佳答案

如果你这样做

ColorCorrectionMatrix = np.linalg.lstsq(m_1, m_2)[0]

然后
m_3 = np.matmul(m_1, ColorCorrectionMatrix)

应该返回一个与m_3接近的m_2数组。也就是说,第一行求解方程

m_1 x = m_2

在最小二乘意义上;因此,m_1x找到的np.linalg.lstsq的简单矩阵乘法应近似于m_2

这意味着您应该在ColorCorrectionMatrix的计算中删除转置。

但是! 此更正将转换应用于错过翻译的颜色。 Lab空间中由a和b跨越的平面是色度平面。该平面原点的点表示白色/灰色(无色)。如果图片需要白点调整(白平衡),则意味着真正的白色不在此平面的原点。需要翻译才能将其移到那里,没有任何数量的乘法将能够实现这一点。

需要解决的方程是

m_1 x + y = m_2

(其中y是白点校正)。如果我们在m_1m_2中添加一列,则可以将其重写为单个矩阵乘法。这称为齐次坐标,有关其外观的概念,请参见this Wikipedia article

在RGB空间中计算色彩校正时,不会发生此问题。在RGB中,原点永远不会移动:黑色是黑色。 RGB值始终为正。白平衡通过乘法来实现。

我建议您将色度计引用值转换为RGB,而不是将图像像素转换为Lab,然后在RGB空间中执行颜色校正。确保确保记录的图像位于线性RGB空间中,而不是sRGB,后者是非线性的(如果事实证明图像另存为sRGB,则会在线找到转换方程式)。

在线性RGB空间中,以与在Lab空间中相同的方式对像素值求平均非常好。

关于python-3.x - LAB色彩空间中的色彩校正矩阵-OpenCV,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49221892/

10-11 04:25