我有一个24块色卡,并且我正在尝试使用所述色卡估计捕获的图像的色彩校正矩阵。我已经使用CCM方法手动估算了least squares,但未产生理想的结果。应用CCM后,某些图像会出现怪异的阴影。
我已经仔细检查了我的代码,但找不到任何故障。我正在寻找任何基于opencv / matlab或任何开源实现的地方,在这些地方我可以提供捕获的颜色值和实际颜色值,并且它可以为我计算和应用CCM以确保是我的实现出现问题或最少平方法不是很有效。



PS:以下是我用来估计和应用色彩校正矩阵(CCM)的MATLAB代码

% calc 3x3 correction matrix
ccm = MactAll * MrawAll' * inv(MrawAll * MrawAll') % MactAll is the 3x24 matirx of actual color card values and MrawAll is the 3x24 matrix of captured color card values

这是我将CCM应用于图像的方式
[my, mx, mc] = size(imageRGB);  % rows, columns, colors (3) %
imageRGB = reshape(imageRGB,my*mx,mc);
correctedRGB = imageRGB*ccm;
correctedRGB = min(correctedRGB,1);  correctedRGB = max(correctedRGB,0);  % Place limits on output.

correctedRGB = reshape(correctedRGB, my, mx, mc);
correctedRGB = uint8(correctedRGB*255);

这是我的结果:

原始图片
matlab - 如何使用24块色卡估算和应用色彩校正矩阵?-LMLPHP

校正图像

matlab - 如何使用24块色卡估算和应用色彩校正矩阵?-LMLPHP

最佳答案

您正在使用的色彩校正模型在这里有很好的描述:

https://www.informatik.hu-berlin.de/de/forschung/gebiete/viscom/thesis/final/Studienarbeit_Behringer_201308.pdf

这也可以在c++ opencv中完成。您必须确定方程式:

 [p1' p2' ... pn' ] = M * [ p1 p2 ... pn]
         P'         = M *        P

其中p1',... pn'是期望值(如果在XYZ颜色空间中更好),p1,... pn是检测到的实数值,M是3x3转换矩阵。

您可以按以下方式解决该系统:
M = P * P'.inv(CV_SVD)

10-08 12:05