¿Cómo estimar y aplicar la matriz de corrección de color usando una tarjeta de color de 24 bloques?

Tengo una tarjeta de color de 24 bloques y estoy tratando de estimar una matriz de corrección de color para las imágenes capturadas con dicha tarjeta de color. He estimado manualmente unCCM utilizando laleast squares método y no está produciendo resultados deseables. Algunas imágenes obtienen un tono extraño después de aplicarCCM.
Revisé mi código dos veces pero no pude encontrar ningún problema técnico. Estoy buscando implementaciones basadas en opencv / matlab o de código abierto donde pueda proporcionar los valores de color capturados y los valores de color reales y pueda calcular y aplicar CCM para mí para asegurarme de que sea mi implementación la que tenga problemas o al menos El método de cuadrados no es muy efectivo.

Nota: No estoy aplicando ninguna linealización a la imagen antes de aplicar CCM. Sugiera cualquier recurso en el que esto pueda probarse rápidamente.

PD: El siguiente es el código MATLAB que estoy usando para estimar y aplicar la Matriz de corrección de color (CCM)

% 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

así es como estoy aplicando el CCM a la imagen

[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);

Aquí están mis resultados:

Imagen original

Imagen corregida

Respuestas a la pregunta(2)

Su respuesta a la pregunta