RGB转为CIELAB

首先RGB是不可以直接转为CIELAB颜色空间的,RGB需要先转为CIEXYZ颜色空间,然后再由CIEXYZ颜色空间转为CIELAB颜色空间。关于这2个颜色空间的互转,主要参考了http://www.cnblogs.com/Imageshop/archive/2013/02/02/2889897.html这篇文章。
RGB转LAB颜色空间的代码如下:

void RGB2LAB(Mat &rgb, Mat &Lab) {//RGB 转XYZMat XYZ(rgb.size(), rgb.type());Mat_ <Vec3b>::iterator beginRGB = rgb.begin<Vec3b>();Mat_ <Vec3b>::iterator endRGB = rgb.end<Vec3b>();Mat_ <Vec3b>::iterator beginXYZ = XYZ.begin<Vec3b>();int shift = 22;for (; beginRGB != endRGB; beginRGB++, beginXYZ++){(*beginXYZ)[0] = ((*beginRGB)[0] * 199049 + (*beginRGB)[1] * 394494 + (*beginRGB)[2] * 455033 + 524288) >> (shift - 2);(*beginXYZ)[1] = ((*beginRGB)[0] * 75675 + (*beginRGB)[1] * 749900 + (*beginRGB)[2] * 223002 + 524288) >> (shift - 2);(*beginXYZ)[2] = ((*beginRGB)[0] * 915161 + (*beginRGB)[1] * 114795 + (*beginRGB)[2] * 18621 + 524288) >> (shift - 2);}//XYZ转LABint LabTab[1024];for (int i = 0; i < 1024; i++){if (i>9)LabTab[i] = (int)(pow((float)i / 1020, 1.0F / 3) * (1 << shift) + 0.5);elseLabTab[i] = (int)((29 * 29.0 * i / (6 * 6 * 3 * 1020) + 4.0 / 29) * (1 << shift) + 0.5);}const int ScaleLC = (int)(16 * 2.55 * (1 << shift) + 0.5);const int ScaleLT = (int)(116 * 2.55 + 0.5);const int HalfShiftValue = 524288;beginXYZ = XYZ.begin<Vec3b>();Mat_<Vec3b>::iterator endXYZ = XYZ.end<Vec3b>();Lab.create(rgb.size(), rgb.type());Mat_<Vec3b>::iterator beginLab = Lab.begin<Vec3b>();for (; beginXYZ != endXYZ; beginXYZ++, beginLab++){int X = LabTab[(*beginXYZ)[0]];int Y = LabTab[(*beginXYZ)[1]];int Z = LabTab[(*beginXYZ)[2]];int L = ((ScaleLT * Y - ScaleLC + HalfShiftValue) >> shift);int A = ((500 * (X - Y) + HalfShiftValue) >> shift) + 128;int B = ((200 * (Y - Z) + HalfShiftValue) >> shift) + 128;(*beginLab)[0] = L;(*beginLab)[1] = A;(*beginLab)[2] = B;}
}

利用LAB颜色空间进行偏色检测

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

其中a,b代表的就是LAB色度空间的A,B。M,N代表图片长宽,一般来说当求出的K值不大于1.5我们可以认为其整体图像偏色的可能性不大。

//true代表存在偏色,false代表不存在偏色
bool PartialcolorJudge(Mat &imgLab) {Mat_<Vec3b>::iterator begin = imgLab.begin<Vec3b>();Mat_<Vec3b>::iterator end = imgLab.end<Vec3b>();float suma = 0, sumb = 0;for (; begin != end; begin++) {suma += (*begin)[1];//asumb += (*begin)[2];//b}int MN = imgLab.rows * imgLab.cols;double Da = suma / MN - 128; //归一化到[-128,127]double Db = sumb / MN - 128; //同上//求平均色度double D = sqrt(Da * Da + Db * Db);begin = imgLab.begin<Vec3b>();double Ma = 0, Mb = 0;//求色度中心距for (; begin != end; begin++) {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);float K = float(D / M);if (K >= 1.5) {return true;}else {return false;}
}

RGB和CIELAB颜色空间转换及偏色检测相关推荐

  1. 颜色空间系列2: RGB和CIELAB颜色空间的转换及优化算法

    颜色空间系列代码下载链接:http://files.cnblogs.com/Imageshop/ImageInfo.rar (同文章同步更新) 在几个常用的颜色空间中,LAB颜色空间是除了RGB外,最 ...

  2. 【Pytorch】rgb转lab颜色空间转换

    最近有需要,自己按照opencv实现的方式,自测! 个别tensor,numpy互转参考:https://oldpan.me/archives/pytorch-tensor-image-transfo ...

  3. Opencv的RGB到HSV颜色空间转换

    从 RGB 到 HSL 或 HSV 的转换 设 (r, g, b) 分别是一个颜色的红.绿和蓝坐标,它们的值是在 0 到 1 之间的实数.设 max 等价于 r, g 和 b 中的最大者.设 min ...

  4. RGB与HSV颜色空间转换

    RGB转化到HSV的算法: max=max(R,G,B): min=min(R,G,B): V=max(R,G,B): S=(max-min)/max: HSV颜色空间模型(圆锥模型) [2] if  ...

  5. RGB和YCbCr颜色空间的转换及优化算法

    RGB和YCbCr颜色空间转换和优化 转载于颜色空间系列3: RGB和YCbCr颜色空间的转换及优化算法 在常用的几种颜色空间中,YCbCr颜色空间在学术论文中出现的频率是相当高的,常用于肤色检测等等 ...

  6. 基于matlab的RGB到YCbCr颜色空间的转换

    在matlab中,图像处理工具箱会将彩色图像当做RGB图像或者索引图像来处理.除了这两种颜色空间外还有其他一些以RGB模型为基础的颜色空间,如常见的YCbCr.HSV.HSI颜色空间等.这里只讲图像从 ...

  7. 图像偏色检测算法,速度快,效果好,共享给大家。

    本文的算法并不是我自己提出的,而是一些论文中提出的,详见 : 1.基于图像分析的偏色检测及颜色校正方法 徐晓昭 , 蔡轶珩 , 刘长江 , 贾克斌 , 沈兰荪 2.皮肤检测技术的研究及改进 为方便大家 ...

  8. 图像偏色检测算法,速度快,效果好,共享给大家

    本篇博文来自博主Imageshop,打赏或想要查阅更多内容可以移步至Imageshop. 转载自:https://www.cnblogs.com/Imageshop/p/3191853.html  侵 ...

  9. Opencv图像偏色检测

    ** 偏色检测公式 ** 图像的偏色不仅与图像色度的平均值有直接关系,还与图像的色度分布特性有关.如果在 a - b色度坐标平面上的二维直方图中色度分布基本上为单峰值,或者分布较为集中,而色度平均值又 ...

最新文章

  1. 发现自己的idea已经被人发表了,该怎么办?研究生灵魂发问,引起热烈讨论
  2. java学习笔记之折半查找法(二分法)
  3. 第一阶段站立会议05
  4. Beta 冲刺(1/7)
  5. SQL server判断字符串是否包含某个字符串
  6. 我读研时通过实习和比赛收入五十万
  7. 计算机网络知识点总结(第六版,谢希仁)
  8. Redis与Jedis排序
  9. pcb钻孔披锋改善报告_铜基板的小孔加工改善研究
  10. 项目遇到的问题总结(四):单页面首屏加载慢解决方案
  11. 使用 ActiveReports 报表工具,动态创建报表模板
  12. html展开收起样式,前端网页内容实现展开/收起全文的操作(js+css控制高度实现)...
  13. 北大青鸟网络工程师benet培训招生问答
  14. http响应报文,如果响应的内容比较大,客户端怎么样判断接收完了呢?
  15. vue中使用市区(地区)联动 复制三步完成
  16. 联发科处理器真有那么不堪吗?
  17. 紫乌鸦服务器维护后多久刷,魔兽世界:9.0卡这个技巧,10分钟5只稀有坐骑,紫乌鸦惑龙入手!...
  18. 1090-A+B for Input-Output Practice (II)
  19. 基于Laravel 框架的内容管理系统
  20. AUTOSAR DiagnosticLogAndTrace(DLT)模块功能概述(一)----DLT基础概念、与SWC\DEM\DET的交互、VFB Trace

热门文章

  1. linux有什么好的软件,Linux国产软件大盘点
  2. python magic number_编程中的「魔数」(magic number)是什么意思?平时我们能接触到哪些魔数?...
  3. 头歌HTML实训笔录
  4. 男孩女孩和他们的父母的有趣问题
  5. 嵌入式Linux系统环境搭建全流程-4412友善之臂开发板
  6. 利用转写软件进行高效记录
  7. java计算机毕业设计体育用品购物系统源码+数据库+系统+lw文档+mybatis+运行部署
  8. 【Windows】关于Windows Powershell找不到打不开修复方法
  9. 用c#二次开发的焊锡检测视觉系统
  10. 半导体的基础-三极管的工作原理,史上绝无仅有的理解方式