Fra*_*erg 5 image-processing python-3.x opencv3.0
假设我们在一个图像中有5个圆的l,a,b值。这些值是使用OpenCV计算的。
imlab=cv2.cvtColor(circle_img_only,cv2.COLOR_BGR2LAB).astype("float32")
Run Code Online (Sandbox Code Playgroud)
实际上,我们从每个圆中获取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 ]]
Run Code Online (Sandbox Code Playgroud)
这些圆也使用比色计仪器测量。比色计产生参考值。
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]
Run Code Online (Sandbox Code Playgroud)
让我们将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])
Run Code Online (Sandbox Code Playgroud)
这将产生:
CCM - Color Correction Matrix =
[[-0.979 -2.998 -2.434]
[ 0.36 1.467 0.568]
[ 0.077 0.031 0.241]]
Run Code Online (Sandbox Code Playgroud)
取得CCM之后-我想将CCM应用到m1(LAB实测颜色)上,并进行更正。
我们该怎么做?
我正在执行以下操作,但是结果似乎不正确:
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])
Run Code Online (Sandbox Code Playgroud)
我们得到以下内容:
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]
Run Code Online (Sandbox Code Playgroud)
如果你这样做
ColorCorrectionMatrix = np.linalg.lstsq(m_1, m_2)[0]
Run Code Online (Sandbox Code Playgroud)
然后
m_3 = np.matmul(m_1, ColorCorrectionMatrix)
Run Code Online (Sandbox Code Playgroud)
应该返回一个m_3接近的数组m_2。也就是说,第一行求解方程
m_1 x = m_2
在最小二乘意义上;因此m_1与 的x简单矩阵乘法np.linalg.lstsq应该近似于m_2。
这意味着您应该在 的计算中删除转置ColorCorrectionMatrix。
但!此更正对错过转换的颜色应用转换。Lab空间中由a和b跨越的平面是色度平面。该平面原点处的点代表白色/灰色(无色)。如果一张图片需要白点调整(白平衡),就意味着真正的白色并不在这个平面的原点。需要进行翻译才能将其移动到那里,任何乘法都无法完成此操作。
需要求解的方程是
m_1 x + y = m_2
(其中y是白点校正)。m_1如果我们将一列 1 添加到和,则可以将其重写为单个矩阵乘法m_2。这称为齐次坐标,请参阅这篇维基百科文章以了解其外观。
在 RGB 空间中计算色彩校正时,不会出现此问题。在 RGB 中,原点永远不会移动:黑色就是黑色。RGB 值始终为正。白平衡是通过乘法完成的。
我建议您将色度计参考值转换为 RGB,而不是将图像像素转换为 Lab,并在 RGB 空间中执行颜色校正。请确保您记录的图像位于线性 RGB 空间,而不是非线性的 sRGB(如果您的图像保存为 sRGB,您可以在网上找到转换方程)。
在线性 RGB 空间中,可以像在 Lab 空间中一样对像素值进行平均。
| 归档时间: |
|
| 查看次数: |
1305 次 |
| 最近记录: |