我有一个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);
这是我的结果:
原始图片
校正图像
最佳答案
您正在使用的色彩校正模型在这里有很好的描述:
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)