当前位置:   article > 正文

最小二乘法求CCM色彩还原矩阵_ccm矩阵计算

ccm矩阵计算

代码

  1. int calc_ccm(double *r, double *g, double *b, double *R, double *G, double *B, int num, double *ccm)
  2. {
  3. double sum_rr=0, sum_gg=0, sum_bb=0, sum_rg=0, sum_gb=0, sum_rb=0;
  4. double sum_rR=0, sum_gR=0, sum_bR=0, sum_rG=0, sum_gG=0, sum_bG=0, sum_rB=0, sum_gB=0, sum_bB=0;
  5. int i, j;
  6. for (i=0; i<num; i++)
  7. {
  8. sum_rr += r[i]*r[i];
  9. sum_gg += g[i]*g[i];
  10. sum_bb += b[i]*b[i];
  11. sum_rg += r[i]*g[i];
  12. sum_gb += g[i]*b[i];
  13. sum_rb += r[i]*b[i];
  14. sum_rR += r[i]*R[i];
  15. sum_gR += g[i]*R[i];
  16. sum_bR += b[i]*R[i];
  17. sum_rG += r[i]*G[i];
  18. sum_gG += g[i]*G[i];
  19. sum_bG += b[i]*G[i];
  20. sum_rB += r[i]*B[i];
  21. sum_gB += g[i]*B[i];
  22. sum_bB += b[i]*B[i];
  23. }
  24. double sum_r2b2_rb2 = sum_rr*sum_bb - sum_rb*sum_rb;
  25. double sum_r2g2_rg2 = sum_rr*sum_gg - sum_rg*sum_rg;
  26. double sum_g2b2_gb2 = sum_gg*sum_bb - sum_gb*sum_gb;
  27. double sum_rgrb_r2gb = sum_rg*sum_rb - sum_rr*sum_gb;
  28. double sum_rggb_g2rb = sum_rg*sum_gb - sum_gg*sum_rb;
  29. double sum_gbrb_b2rg = sum_gb*sum_rb - sum_bb*sum_rg;
  30. double q = sum_rr*sum_gg*sum_bb - sum_rr*sum_gb*sum_gb - sum_gg*sum_rb*sum_rb
  31. - sum_bb*sum_rg*sum_rg + 2*sum_rg*sum_rb*sum_gb;
  32. ccm[0] = (sum_g2b2_gb2*sum_rR + sum_gbrb_b2rg*sum_gR + sum_rggb_g2rb*sum_bR)/q;
  33. ccm[1] = (sum_gbrb_b2rg*sum_rR + sum_r2b2_rb2*sum_gR + sum_rgrb_r2gb*sum_bR)/q;
  34. ccm[2] = (sum_rggb_g2rb*sum_rR + sum_rgrb_r2gb*sum_gR + sum_r2g2_rg2*sum_bR)/q;
  35. ccm[3] = (sum_g2b2_gb2*sum_rG + sum_gbrb_b2rg*sum_gG + sum_rggb_g2rb*sum_bG)/q;
  36. ccm[4] = (sum_gbrb_b2rg*sum_rG + sum_r2b2_rb2*sum_gG + sum_rgrb_r2gb*sum_bG)/q;
  37. ccm[5] = (sum_rggb_g2rb*sum_rG + sum_rgrb_r2gb*sum_gG + sum_r2g2_rg2*sum_bG)/q;
  38. ccm[6] = (sum_g2b2_gb2*sum_rB + sum_gbrb_b2rg*sum_gB + sum_rggb_g2rb*sum_bB)/q;
  39. ccm[7] = (sum_gbrb_b2rg*sum_rB + sum_r2b2_rb2*sum_gB + sum_rgrb_r2gb*sum_bB)/q;
  40. ccm[8] = (sum_rggb_g2rb*sum_rB + sum_rgrb_r2gb*sum_gB + sum_r2g2_rg2*sum_bB)/q;
  41. //normalize
  42. for (i=0; i<3; i++)
  43. {
  44. double scale = 0;
  45. for (j=0; j<3; j++)
  46. {
  47. scale += ccm[i*3+j];
  48. }
  49. for (j=0; j<3; j++)
  50. {
  51. ccm[i*3+j] /= scale;
  52. }
  53. }
  54. return 0;
  55. }

博客链接:http://www.voidcn.com/article/p-zpnlmlea-yz.html

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号