Opencv图像偏色检测
**
- 偏色检测公式
**
图像的偏色不仅与图像色度的平均值有直接关系,还与图像的色度分布特性有关。如果在 a - b色度坐标平面上的二维直方图中色度分布基本上为单峰值,或者分布较为集中,而色度平均值又较大时,一般都存在偏色,而且色度平均值越大,偏色越严重。因此引入等效圆的概念,采用图像平均色度D和色度中心距M的比值,即偏色因子K来衡量图像的偏色程度。其计算方法如下式:
以上摘自论文**《基于图像分析的偏色检测及颜色校正方法》——徐晓昭,蔡轶珩等。**
但是在实际应用中,公式(3)去掉平方可更好的指示图像是否偏色:
**
2.RGB颜色空间转Lab颜色空间
**
颜色转换原理见:颜色空间系列2: RGB和CIELAB颜色空间的转换及优化算法
利用opencv实现代码为:
void RGB2LAB(Mat& rgb, Mat& Lab)
{Mat XYZ(rgb.size(), rgb.type());Mat_<Vec3b>::iterator begainRGB = rgb.begin<Vec3b>();Mat_<Vec3b>::iterator endRGB = rgb.end<Vec3b>();Mat_<Vec3b>::iterator begainXYZ = XYZ.begin<Vec3b>();int shift = 22;for (; begainRGB != endRGB; begainRGB++, begainXYZ++){(*begainXYZ)[0] = ((*begainRGB)[0] * 199049 + (*begainRGB)[1] * 394494 + (*begainRGB)[2] * 455033 + 524288) >> (shift-2);(*begainXYZ)[1] = ((*begainRGB)[0] * 75675 + (*begainRGB)[1] * 749900 + (*begainRGB)[2] * 223002 + 524288) >> (shift-2);(*begainXYZ)[2] = ((*begainRGB)[0] * 915161 + (*begainRGB)[1] * 114795 + (*begainRGB)[2] * 18621 + 524288) >> (shift-2);}int 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;begainXYZ = XYZ.begin<Vec3b>();Mat_<Vec3b>::iterator endXYZ = XYZ.end<Vec3b>();Lab.create(rgb.size(),rgb.type());Mat_<Vec3b>::iterator begainLab = Lab.begin<Vec3b>();for (; begainXYZ != endXYZ; begainXYZ++, begainLab++){int X = LabTab[(*begainXYZ)[0]];int Y = LabTab[(*begainXYZ)[1]];int Z = LabTab[(*begainXYZ)[2]];int L = ((ScaleLT * Y - ScaleLC + HalfShiftValue) >> shift);int A = ((500 * (X - Y) + HalfShiftValue) >> shift) + 128;int B = ((200 * (Y - Z) + HalfShiftValue) >> shift) + 128;(*begainLab)[0] = L;(*begainLab)[1] = A;(*begainLab)[2] = B;}
}
3.偏色检测算法实现
根据偏色检测公式,opencv实现过程为:
float colorCheck(const Mat& imgLab)
{Mat_<Vec3b>::const_iterator begainIt = imgLab.begin<Vec3b>();Mat_<Vec3b>::const_iterator endIt = imgLab.end<Vec3b>();float aSum = 0;float bSum = 0;for (; begainIt != endIt; begainIt++){aSum += (*begainIt)[1];bSum += (*begainIt)[2];}int MN = imgLab.cols*imgLab.rows;double Da = aSum / MN - 128; // 必须归一化到[-128,,127]范围内 double Db = bSum / MN - 128;//平均色度double D = sqrt(Da*Da+Db*Db);begainIt = imgLab.begin<Vec3b>();double Ma = 0;double Mb = 0;for (; begainIt != endIt; begainIt++){Ma += abs((*begainIt)[1]-128 - Da);Mb += abs((*begainIt)[2]-128 - Db);}Ma = Ma / MN;Mb = Mb / MN;//色度中心距double M = sqrt(Ma*Ma + Mb*Mb);//偏色因子float K = (float)(D / M);return K;
}
综合来说,k值不大于1.5我们可以认为其整体图像偏色的可能性不大,当然这个值取多少可能还是需要和实际情况结合的。
Opencv图像偏色检测相关推荐
- opencv 图像阴影检测
opencv 图像阴影检测 GarfieldEr007 2017-01-09 原文 参数说明: IplImage *workImg-当前全局变量,表示正在显示的图片. downleft, upri ...
- OpenCV 图像轮廓检测
本文是OpenCV图像视觉入门之路的第15篇文章,本文详细的介绍了图像轮廓检测的各种操作,例如:轮廓检索模式.轮廓逼近算子等操作. 图像轮廓是具有相同颜色或灰度的连续点的曲线,轮廓在形状分析和物体的检 ...
- 图像偏色检测算法,速度快,效果好,共享给大家。
本文的算法并不是我自己提出的,而是一些论文中提出的,详见 : 1.基于图像分析的偏色检测及颜色校正方法 徐晓昭 , 蔡轶珩 , 刘长江 , 贾克斌 , 沈兰荪 2.皮肤检测技术的研究及改进 为方便大家 ...
- OPENCV图像轮廓检测
前面在图像转换的时候学到canny算子,可以检测出图像的轮廓信息,但是,该算子检测到的轮廓信息还需要我们手动的用眼睛去识别,而实际工程应用中,我们需要得到轮廓的具体数学信息,这就涉及到今天的主题,图像 ...
- 图像偏色检测算法,速度快,效果好,共享给大家
本篇博文来自博主Imageshop,打赏或想要查阅更多内容可以移步至Imageshop. 转载自:https://www.cnblogs.com/Imageshop/p/3191853.html 侵 ...
- 视频质量检测(3)--图像偏色检测
本文主要介绍图像偏色的检测. 1.偏色的定义 2.算法思路 RGB颜色空间是最简单的一种颜色空间,但是RGB颜色空间最大的局限性在于当用欧氏距离来刻画两种颜色之间的差异时,所计算出的两种颜色之间的距无 ...
- opencv 图像雾检测_OpenCV图像处理-基于OpenPose的关键点检测
OpenCV基于OpenPose的手部关键点检测 概述 ✔️ 手部关键点检测,旨在找出给定图片中手指上的关节点及指尖关节点, 其中手部关键点检测的应用场景主要包括: 手势识别 手语识别与理解 手部的行 ...
- opencv 图像雾检测_雾的检测算法
雾的检测算法相对来说文献不是很多,这次和大家介绍两篇相对来说比较容易实现的两篇文章,其中一篇是基于灰度直方图的方式进行分析检测,另一篇是将rgb图像空间转化为hsv空间进行分析检测. 1.灰度图检测 ...
- opencv 图像雾检测_专栏 | OpenCV图像处理专栏十 | 利用中值滤波进行去雾
原标题:专栏 | OpenCV图像处理专栏十 | 利用中值滤波进行去雾 前言 这是OpenCV图像处理专栏的第十篇文章,介绍一种利用中值滤波来实现去雾的算法.这个方法发表于国内的一篇论文,链接我放附录 ...
最新文章
- 自动驾驶汽车的规划与控制
- 迈向成功的关键在于执行(摘自李开复博士的《做最好的自己》)
- 安装Matlab出现Error 1935错误解决方法
- 参与Apache顶级开源项目的N种方式,Apache Dubbo Samples SIG 成立!
- java按键发出声音代码_怎么在java中给按钮添加声音?
- git 查看修改用户名
- 下载 LINUX 和 windows 版本下 MySQL5.7.32
- win10上卸载ubuntu
- 浅析360在系统的进程自保护及突破
- 8421BCD码与十进制的转换
- 给你的亲人一个科技感满满的生日祝福吧
- 一看就懂系列:java8流的扁平化/什么是扁平化流(图解)
- WC2007 剪刀石头布【补集转化+比赛问题费用流】
- 控制系统仿真与CAD-薛定宇-第四章matlab学习笔记
- 使用eCharts做了一个中国地图的各地之间的线路连接
- 【Jquery】jquery-qrcode把域名地址生成二维码图片,扫码即可访问
- [PMP]作业题(一)模拟题错题整理
- xxl-job远程命令执行漏洞复现
- 路漫漫........
- 亚马逊、速卖通、wish、Lazada、shoppe、ebay、煤炉测评跟淘宝shua单区别在哪?