原文链接:http://blog.csdn.net/kklots/article/details/12720359
昨天老板临时交代一个活,要求通过算法检测监控设备是否存在失焦、偏色、亮度异常等问题。问题本身不难,在网上查看了一些资料,自己也做了一些思考,方法如下:
        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;
}  

最后展示一下结果

可以发现:当亮度变低时,失焦检测显示结果为:模糊。这是由于失焦检测依赖于梯度统计,亮度变低时,会导致梯度值整体下降,从而导致检测不正确。一种更好的方法是利用亮度检测的结果,合理设定失焦检测的报警阈值,避免这种情况。

视频清晰度、色偏以及亮度异常检测相关推荐

  1. ng机器学习视频笔记(十三) ——异常检测与高斯密度估计

    ng机器学习视频笔记(十三) --异常检测与高斯密度估计 (转载请附上本文链接--linhxx) 一.概述 异常检测(anomaly detection),主要用于检查对于某些场景下,是否存在异常内容 ...

  2. Real-world Anomaly Detection in Surveillance Videos监控视频中的现实世界异常检测

    监控视频中的现实世界异常检测,代码地址https://paperswithcode.com/paper/real-world-anomaly-detection-in-surveillance. 摘要 ...

  3. 基于OpenCV对图片清晰度、色偏和亮度的检测(java版)

    由来:近期项目需要检测图片的亮度和色偏,但网上大多为用C实现的,没有java版本的,此篇为java版本对opencv的调用,谨以此献给CSDN的广大用户. 一. 导入OpenCV所需依赖 依赖下载:O ...

  4. java OpenCV 图片清晰度、色偏和亮度检测

    基于OpenCV对图片清晰度.色偏和亮度的检测(java版) 本文链接:https://blog.csdn.net/qq_34997906/article/details/87970817 由来:近期 ...

  5. Learning Memory-guided Normality for Anomaly Detection——学习记忆引导的常态异常检测

    又是一篇在自编码器框架中研究使用记忆模块的论文,可以看做19年的iccv的论文的衍生,在我的博客中对19年iccv这篇论文也做了简单介绍.韩国人写的,应该是吧,这名字听起来就像. 摘要abstract ...

  6. 异常检测 | 基于Siamese网络学习距离函数来定位视频中的异常

    关于<Learning a distance function with a Siamese network to localize anomalies in videos>论文学习 这篇 ...

  7. ICCV 2021 oral 重构+预测,双管齐下提升视频异常检测性能

    关注公众号,发现CV技术之美 本文分享 ICCV 2021 oral 论文『A Hybrid Video Anomaly Detection Framework via Memory-Augmente ...

  8. CVPR 2021 | 又好又快的视频异常检测,引入元学习的动态原型学习组件

    Learning Normal Dynamics in Videos with Meta Prototype Network 作者:Hui lv, Chen Chen, Zhen Cui, Chuny ...

  9. 一些用于拥挤场景的异常检测的视频数据集

    UCSD Anomaly Detection Dataset http://www.svcl.ucsd.edu/projects/anomaly/dataset.htm UCSD(加州圣地亚哥大学分校 ...

最新文章

  1. 结合实例与代码谈数字图像处理都研究什么?
  2. 原生js给div添加类
  3. stanford python中文分词
  4. MapInfo MapXtreme 2005 WebGIS 简单鹰眼设计(转)
  5. Django:DjangoProject项目结构简介
  6. linux块设备缓存bcache
  7. MySql 初步整理
  8. J1939 入门教程
  9. EEGLAB在MATLAB中的下载、安装教程
  10. 什么是Web全栈工程师
  11. macbook pro配置maven环境变量
  12. MySQL 数据库命名规范.PDF
  13. 怎么把计算机隐藏文件显示出来,怎么把隐藏的文件夹显示出来
  14. 景深与光圈与焦距关系
  15. java计算机毕业设计网上鲜花店系统源码+系统+数据库+lw文档
  16. PHP拼团人数不能超过,怎么解决拼团、抽奖难以凑齐人数这个大问题?
  17. 2021 互联网公司时薪排行榜出炉!微软、美团很强!
  18. Unity 3D 海水的实现2 折射与反射 离屏相机的渲染
  19. 蓝牙HC-05出现进入AT模式之后串口发送AT无返回值或者返回乱码情况
  20. cf修改游戏客户端是什么意思_穿越火线修改游戏名方法

热门文章

  1. Tomcat performance optimization through consolidated log file handlers
  2. Spring Enable annotation – writing a custom Enable annotation
  3. spring源码分析之context
  4. 【采用】【评分卡开发】信用评分模型构建流程
  5. Spring Boot:使用Rabbit MQ消息队列
  6. 使用vue-cli+element-ui+expsess+mysql做一个简易的登录功能
  7. MIT提出Matlab插件mNeuron:实现深度模型神经元的可视化
  8. 阿里“三活”数据中心实践经验:没人能做,我们就自己做
  9. 催收成本在单体经济中的分析
  10. SpringBoot - 优雅的实现【参数校验】高级进阶