视频清晰度、色偏以及亮度异常检测
2013-10-15 01:23
267 查看
昨天老板临时交代一个活,要求通过算法检测监控设备是否存在失焦、偏色、亮度异常等问题。问题本身不难,在网上查看了一些资料,自己也做了一些思考,方法如下:
1.失焦检测。
失焦的主要表现就是画面模糊,衡量画面模糊的主要方法就是梯度的统计特征,通常梯度值越高,画面的边缘信息越丰富,图像越清晰。需要注意的是梯度信息与每一个视频本身的特点有关系,如果画面中本身的纹理就很少,即使不失焦,梯度统计信息也会很少,对监控设备失焦检测需要人工参与的标定过程,由人告诉计算机某个设备正常情况下的纹理信息是怎样的。
2.色偏检测。
网上常用的一种方法是将RGB图像转变到CIE L*a*b*空间,其中L*表示图像亮度,a*表示图像红/绿分量,b*表示图像黄/蓝分量。通常存在色偏的图像,在a*和b*分量上的均值会偏离原点很远,方差也会偏小;通过计算图像在a*和b*分量上的均值和方差,就可评估图像是否存在色偏。计算CIE L*a*b*空间是一个比较繁琐的过程,好在OpenCV提供了现成的函数,因此整个过程也不复杂。
3.亮度检测。
亮度检测与色偏检测相似,计算图片在灰度图上的均值和方差,当存在亮度异常时,均值会偏离均值点(可以假设为128),方差也会偏小;通过计算灰度图的均值和方差,就可评估图像是否存在过曝光或曝光不足。函数如下:
最后展示一下结果。
可以发现:当亮度变低时,失焦检测显示结果为:模糊。这是由于失焦检测依赖于梯度统计,亮度变低时,会导致梯度值整体下降,从而导致检测不正确。一种更好的方法是利用亮度检测的结果,合理设定失焦检测的报警阈值,避免这种情况。
源代码相关下载地址:http://iask.sina.com.cn/u/ish?uid=1171839324(如果不可见,表示还未通过审核,请稍后重试)。
1.失焦检测。
失焦的主要表现就是画面模糊,衡量画面模糊的主要方法就是梯度的统计特征,通常梯度值越高,画面的边缘信息越丰富,图像越清晰。需要注意的是梯度信息与每一个视频本身的特点有关系,如果画面中本身的纹理就很少,即使不失焦,梯度统计信息也会很少,对监控设备失焦检测需要人工参与的标定过程,由人告诉计算机某个设备正常情况下的纹理信息是怎样的。
/******************************************************************************** *函数描述: DefRto 计算并返回一幅图像的清晰度 *函数参数: frame 彩色帧图 *函数返回值:double 清晰度表示值,针对该视频,当清晰度小于10为模糊,大于14为清楚 *********************************************************************************/ double DefRto(Mat frame) { Mat gray; cvtColor(frame,gray,CV_BGR2GRAY); IplImage *img = &(IplImage(gray)); double temp = 0; double DR = 0; int i,j;//循环变量 int height=img->height; int width=img->width; int step=img->widthStep/sizeof(uchar); uchar *data=(uchar*)img->imageData; double num = width*height; for(i=0;i<height;i++) { for(j=0;j<width;j++) { temp += sqrt((pow((double)(data[(i+1)*step+j]-data[i*step+j]),2) + pow((double)(data[i*step+j+1]-data[i*step+j]),2))); temp += abs(data[(i+1)*step+j]-data[i*step+j])+abs(data[i*step+j+1]-data[i*step+j]); } } DR = temp/num; return DR; }
2.色偏检测。
网上常用的一种方法是将RGB图像转变到CIE L*a*b*空间,其中L*表示图像亮度,a*表示图像红/绿分量,b*表示图像黄/蓝分量。通常存在色偏的图像,在a*和b*分量上的均值会偏离原点很远,方差也会偏小;通过计算图像在a*和b*分量上的均值和方差,就可评估图像是否存在色偏。计算CIE L*a*b*空间是一个比较繁琐的过程,好在OpenCV提供了现成的函数,因此整个过程也不复杂。
/******************************************************************************************** *函数描述: calcCast 计算并返回一幅图像的色偏度以及,色偏方向 *函数参数: InputImg 需要计算的图片,BGR存放格式,彩色(3通道),灰度图无效 * cast 计算出的偏差值,小于1表示比较正常,大于1表示存在色偏 * da 红/绿色偏估计值,da大于0,表示偏红;da小于0表示偏绿 * db 黄/蓝色偏估计值,db大于0,表示偏黄;db小于0表示偏蓝 *函数返回值: 返回值通过cast、da、db三个应用返回,无显式返回值 *********************************************************************************************/ void colorException(Mat InputImg,float& cast,float& da,float& db) { Mat LABimg; cvtColor(InputImg,LABimg,CV_BGR2Lab);//参考http://blog.csdn.net/laviewpbt/article/details/9335767 //由于OpenCV定义的格式是uint8,这里输出的LABimg从标准的0~100,-127~127,-127~127,被映射到了0~255,0~255,0~255空间 float a=0,b=0; int HistA[256],HistB[256]; for(int i=0;i<256;i++) { HistA[i]=0; HistB[i]=0; } for(int i=0;i<LABimg.rows;i++) { for(int j=0;j<LABimg.cols;j++) { a+=float(LABimg.at<cv::Vec3b>(i,j)[1]-128);//在计算过程中,要考虑将CIE L*a*b*空间还原 后同 b+=float(LABimg.at<cv::Vec3b>(i,j)[2]-128); int x=LABimg.at<cv::Vec3b>(i,j)[1]; int y=LABimg.at<cv::Vec3b>(i,j)[2]; HistA[x]++; HistB[y]++; } } da=a/float(LABimg.rows*LABimg.cols); db=b/float(LABimg.rows*LABimg.cols); float D =sqrt(da*da+db*db); float Ma=0,Mb=0; for(int i=0;i<256;i++) { Ma+=abs(i-128-da)*HistA[i];//计算范围-128~127 Mb+=abs(i-128-db)*HistB[i]; } Ma/=float((LABimg.rows*LABimg.cols)); Mb/=float((LABimg.rows*LABimg.cols)); float M=sqrt(Ma*Ma+Mb*Mb); float K=D/M; cast = K; return; }
3.亮度检测。
亮度检测与色偏检测相似,计算图片在灰度图上的均值和方差,当存在亮度异常时,均值会偏离均值点(可以假设为128),方差也会偏小;通过计算灰度图的均值和方差,就可评估图像是否存在过曝光或曝光不足。函数如下:
/********************************************************************************************************************************************************* *函数描述: brightnessException 计算并返回一幅图像的色偏度以及,色偏方向 *函数参数: InputImg 需要计算的图片,BGR存放格式,彩色(3通道),灰度图无效 * cast 计算出的偏差值,小于1表示比较正常,大于1表示存在亮度异常;当cast异常时,da大于0表示过亮,da小于0表示过暗 *函数返回值: 返回值通过cast、da两个引用返回,无显式返回值 **********************************************************************************************************************************************************/ void brightnessException (Mat InputImg,float& cast,float& da) { Mat GRAYimg; cvtColor(InputImg,GRAYimg,CV_BGR2GRAY); float a=0; int Hist[256]; for(int i=0;i<256;i++) Hist[i]=0; for(int i=0;i<GRAYimg.rows;i++) { for(int j=0;j<GRAYimg.cols;j++) { a+=float(GRAYimg.at<uchar>(i,j)-128);//在计算过程中,考虑128为亮度均值点 int x=GRAYimg.at<uchar>(i,j); Hist[x]++; } } da=a/float(GRAYimg.rows*InputImg.cols); float D =abs(da); float Ma=0; for(int i=0;i<256;i++) { Ma+=abs(i-128-da)*Hist[i]; } Ma/=float((GRAYimg.rows*GRAYimg.cols)); float M=abs(Ma); float K=D/M; cast = K; return; }
最后展示一下结果。
可以发现:当亮度变低时,失焦检测显示结果为:模糊。这是由于失焦检测依赖于梯度统计,亮度变低时,会导致梯度值整体下降,从而导致检测不正确。一种更好的方法是利用亮度检测的结果,合理设定失焦检测的报警阈值,避免这种情况。
源代码相关下载地址:http://iask.sina.com.cn/u/ish?uid=1171839324(如果不可见,表示还未通过审核,请稍后重试)。
相关文章推荐
- 视频清晰度、色偏以及亮度异常检测
- 视频清晰度、色偏以及亮度异常检测
- 视频清晰度、色偏以及亮度异常检测
- 视频质量诊断----亮度异常检测
- 斯坦福机器学习视频笔记 Week9 异常检测和高斯混合模型 Anomaly Detection
- 【论文笔记】监控视频中异常事件检测及异常事件摘要
- 视频质量诊断----色度异常检测
- 浅谈数据挖掘中的数据处理(缺失值处理以及异常值检测)
- 视频清晰度、色偏以及亮度异常检测
- Android之视频播放以及亮度音量变换
- opencv 学习之 图像色偏、清晰度、亮度检测
- throws和throw的用法例子以及检测和非检查异常
- 检测图像失焦、偏色、亮度异常
- opencv+视频亮度检测
- 解决windows下adb.exe检测设备失败以及“Unable to establish loopback connection”异常
- 离群点检测与序列数据异常检测以及异常检测大杀器-iForest
- 韩顺平php视频笔记80 81 错误日志 异常捕获
- Windows Phone 处理 MessageBox导致的应用异常退出以及使用代码方式退出应用 推荐
- MATLAB实现的视频运动检测方法
- opencv标准霍夫变换检测直线以及描绘每条线段中pt1、pt2点的确定