cielab颜色空间标准色,颜色值转rgb

  cielab颜色空间标准色,颜色值转rgb

  RGB转为色空间首先RGB是不可以直接转为色空间颜色空间的,RGB需要先转为CIEXYZ颜色空间,然后再由CIEXYZ颜色空间转为色空间颜色空间。关于这2个颜色空间的互转,主要参考了这篇文章。

  RGB转实验室颜色空间的代码如下:

  void RGB2LAB(Mat rgb,Mat Lab) {

  //RGB转坐标

  Mat XYZ(rgb.size(),rgb。type());

  Mat_ Vec3b:迭代器beginRGB=rgb.begin Vec3b

  Mat_ Vec3b:迭代器endRGB=rgb.end Vec3b

  Mat_ Vec3b:迭代器beginXYZ=XYZ.begin Vec3b

  int shift=22

  for(;beginRGB!=endRGBbeginRGB,beginXYZ)

  {

  (* begin XYZ)[0]=((* begin RGB)[0]* 199049(* begin RGB)[1]* 394494(* begin RGB)[2]* 455033 524288)(shift-2);

  (* begin XYZ)[1]=((* begin RGB)[0]* 75675(* begin RGB)[1]* 749900(* begin RGB)[2]* 223002 524288)(shift-2);

  (* begin XYZ)[2]=((* begin RGB)[0]* 915161(* begin RGB)[1]* 114795(* begin RGB)[2]* 18621 524288)(shift-2);

  }

  //XYZ转实验室

  int LabTab[1024];

  for(int I=0;i 1024我)

  {

  如果(i 9)

  LabTab[I]=(int)(pow((float)I/1020,1.0f/3)*(1 shift)0.5);

  其他

  LabTab[I]=(int)((29 * 29.0 * I/(6 * 6 * 3 * 1020)4.0/29)*(1移位)0.5);

  }

  const int scale LC=(int)(16 * 2.55 *(1移位)0.5);

  const int scale lt=(int)(116 * 2.55 0.5);

  const int HalfShiftValue=524288

  beginXYZ=XYZ.begin Vec3b

  Mat_ Vec3b:迭代器endXYZ=XYZ.end Vec3b

  Lab.create(rgb.size()、rgb。type());

  Mat_ Vec3b:迭代器beginLab=Lab.begin Vec3b

  for(;beginXYZ!=endXYZbeginXYZ,beginLab)

  {

  int X=LabTab[(* begin XYZ)[0]];

  int Y=LabTab[(* begin XYZ)[1]];

  int Z=LabTab[(* begin XYZ)[2]];

  int L=((scale lt * Y-scale LC半移值)shift);

  int A=((500 *(X-Y)半移位值)shift)128;

  int B=((200 *(Y-Z)半移位值)shift)128;

  (* begin lab)[0]=L;

  (* begin lab)[1]=A;

  (* begin lab)[2]=B;

  }

  }利用实验室颜色空间进行偏色检测这种方法是《基于图像分析的偏色检测及颜色校正方法》 ——徐晓昭,蔡轶珩提出来的一个理论,大概是说:图像的偏色不仅与图像色度的平均值有直接关系,还与图像的色度分布特性有关。如果在甲-乙色度坐标平面上的二维直方图中色度分布基本上为单峰值,或者分布较为集中,而色度平均值又较大时,一般都存在偏色,而且色度平均值越大,偏色越严重。因此引入等效圆的概念,采用图像平均色度D和色度中心距M的比值,即偏色因子K来衡量图像的偏色程度。其计算方法如下式:

  其中甲,乙代表的就是实验室色度空间的甲,乙。男,女代表图片长宽,一般来说当求出的K值不大于1.5我们可以认为其整体图像偏色的可能性不大。

  //真代表存在偏色,假的代表不存在偏色

  布尔偏色判断(Mat im glab){

  Mat_ Vec3b:迭代器begin=imgLab.begin Vec3b

  Mat_ Vec3b:迭代器end=imgLab.end Vec3b

  浮点suma=0,sumb=0;

  for(;开始!=结束;开始){

  suma=(* begin)[1];//a

  sumb=(* begin)[2];//b

  }

  int MN=img lab。行数* img实验室。cols

  双da=suma/MN-128;//归一化到[-128,127]

  double Db=sumb/MN-128;//同上

  //求平均色度

  double D=sqrt(Da * Da Db * Db);

  begin=imgLab.begin Vec3b

  双Ma=0,Mb=0;

  //求色度中心距

  for(;开始!=结束;开始){

  ma=ABS((* begin)[1]-128-Da);

  MB=ABS((* begin)[2]-128-Db);

  }

  Ma=Ma/MN;

  Mb=Mb/MN;

  double M=sqrt(Ma * Ma Mb * Mb);

  浮子K=浮子(日/月);

  如果(K=1.5) {

  返回真实的

  }

  否则{

  返回错误的

  }

  }

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: