检测图像失焦、偏色、亮度异常

2023-11-23 09:21

本文主要是介绍检测图像失焦、偏色、亮度异常,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


要求通过算法检测监控设备是否存在失焦、偏色、亮度异常等问题。问题本身不难,在网上查看了一些资料,自己也做了一些思考,方法如下:

        1.失焦检测。

        失焦的主要表现就是画面模糊,衡量画面模糊的主要方法就是梯度的统计特征,通常梯度值越高,画面的边缘信息越丰富,图像越清晰。需要注意的是梯度信息与每一个视频本身的特点有关系,如果画面中本身的纹理就很少,即使不失焦,梯度统计信息也会很少,对监控设备失焦检测需要人工参与的标定过程,由人告诉计算机某个设备正常情况下的纹理信息是怎样的。

[cpp]  view plain copy
  1. /******************************************************************************** 
  2. *函数描述:  DefRto 计算并返回一幅图像的清晰度    
  3. *函数参数: frame  彩色帧图 
  4. *函数返回值:double   清晰度表示值,针对该视频,当清晰度小于10为模糊,大于14为清楚                   
  5. *********************************************************************************/  
  6. double DefRto(Mat frame)  
  7. {  
  8.     Mat gray;  
  9.     cvtColor(frame,gray,CV_BGR2GRAY);  
  10.     IplImage *img = &(IplImage(gray));  
  11.     double temp = 0;  
  12.     double DR = 0;  
  13.     int i,j;//循环变量  
  14.     int height=img->height;  
  15.     int width=img->width;  
  16.     int step=img->widthStep/sizeof(uchar);  
  17.     uchar *data=(uchar*)img->imageData;  
  18.     double num = width*height;  
  19.   
  20.     for(i=0;i<height;i++)  
  21.     {  
  22.         for(j=0;j<width;j++)  
  23.         {  
  24.             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)));  
  25.             temp += abs(data[(i+1)*step+j]-data[i*step+j])+abs(data[i*step+j+1]-data[i*step+j]);  
  26.         }  
  27.     }  
  28.     DR = temp/num;  
  29.     return DR;  
  30. }  

        2.色偏检测。

        网上常用的一种方法是将RGB图像转变到CIE L*a*b*空间,其中L*表示图像亮度,a*表示图像红/绿分量,b*表示图像黄/蓝分量。通常存在色偏的图像,在a*和b*分量上的均值会偏离原点很远,方差也会偏小;通过计算图像在a*和b*分量上的均值和方差,就可评估图像是否存在色偏。计算CIE L*a*b*空间是一个比较繁琐的过程,好在OpenCV提供了现成的函数,因此整个过程也不复杂。

[cpp]  view plain copy
  1. /******************************************************************************************** 
  2. *函数描述:  calcCast    计算并返回一幅图像的色偏度以及,色偏方向    
  3. *函数参数:  InputImg    需要计算的图片,BGR存放格式,彩色(3通道),灰度图无效 
  4. *           cast        计算出的偏差值,小于1表示比较正常,大于1表示存在色偏 
  5. *           da          红/绿色偏估计值,da大于0,表示偏红;da小于0表示偏绿 
  6. *           db          黄/蓝色偏估计值,db大于0,表示偏黄;db小于0表示偏蓝 
  7. *函数返回值: 返回值通过cast、da、db三个应用返回,无显式返回值 
  8. *********************************************************************************************/  
  9. void colorException(Mat InputImg,float& cast,float& da,float& db)  
  10. {  
  11.     Mat LABimg;  
  12.     cvtColor(InputImg,LABimg,CV_BGR2Lab);//参考http://blog.csdn.net/laviewpbt/article/details/9335767  
  13.                                        //由于OpenCV定义的格式是uint8,这里输出的LABimg从标准的0~100,-127~127,-127~127,被映射到了0~255,0~255,0~255空间  
  14.     float a=0,b=0;  
  15.     int HistA[256],HistB[256];  
  16.     for(int i=0;i<256;i++)  
  17.     {  
  18.         HistA[i]=0;  
  19.         HistB[i]=0;  
  20.     }  
  21.     for(int i=0;i<LABimg.rows;i++)  
  22.     {  
  23.         for(int j=0;j<LABimg.cols;j++)  
  24.         {  
  25.             a+=float(LABimg.at<cv::Vec3b>(i,j)[1]-128);//在计算过程中,要考虑将CIE L*a*b*空间还原 后同  
  26.             b+=float(LABimg.at<cv::Vec3b>(i,j)[2]-128);  
  27.             int x=LABimg.at<cv::Vec3b>(i,j)[1];  
  28.             int y=LABimg.at<cv::Vec3b>(i,j)[2];  
  29.             HistA[x]++;  
  30.             HistB[y]++;  
  31.         }  
  32.     }  
  33.     da=a/float(LABimg.rows*LABimg.cols);  
  34.     db=b/float(LABimg.rows*LABimg.cols);  
  35.     float D =sqrt(da*da+db*db);  
  36.     float Ma=0,Mb=0;  
  37.     for(int i=0;i<256;i++)  
  38.     {  
  39.         Ma+=abs(i-128-da)*HistA[i];//计算范围-128~127  
  40.         Mb+=abs(i-128-db)*HistB[i];  
  41.     }  
  42.     Ma/=float((LABimg.rows*LABimg.cols));  
  43.     Mb/=float((LABimg.rows*LABimg.cols));  
  44.     float M=sqrt(Ma*Ma+Mb*Mb);  
  45.     float K=D/M;  
  46.     cast = K;  
  47.     return;  
  48. }  

        3.亮度检测。

        亮度检测与色偏检测相似,计算图片在灰度图上的均值和方差,当存在亮度异常时,均值会偏离均值点(可以假设为128),方差也会偏小;通过计算灰度图的均值和方差,就可评估图像是否存在过曝光或曝光不足。函数如下:

[cpp]  view plain copy
  1. /********************************************************************************************************************************************************* 
  2. *函数描述:  brightnessException     计算并返回一幅图像的色偏度以及,色偏方向    
  3. *函数参数:  InputImg    需要计算的图片,BGR存放格式,彩色(3通道),灰度图无效 
  4. *           cast        计算出的偏差值,小于1表示比较正常,大于1表示存在亮度异常;当cast异常时,da大于0表示过亮,da小于0表示过暗 
  5. *函数返回值: 返回值通过cast、da两个引用返回,无显式返回值 
  6. **********************************************************************************************************************************************************/  
  7. void brightnessException (Mat InputImg,float& cast,float& da)  
  8. {  
  9.     Mat GRAYimg;  
  10.     cvtColor(InputImg,GRAYimg,CV_BGR2GRAY);  
  11.     float a=0;  
  12.     int Hist[256];  
  13.     for(int i=0;i<256;i++)  
  14.     Hist[i]=0;  
  15.     for(int i=0;i<GRAYimg.rows;i++)  
  16.     {  
  17.         for(int j=0;j<GRAYimg.cols;j++)  
  18.         {  
  19.             a+=float(GRAYimg.at<uchar>(i,j)-128);//在计算过程中,考虑128为亮度均值点  
  20.             int x=GRAYimg.at<uchar>(i,j);  
  21.             Hist[x]++;  
  22.         }  
  23.     }  
  24.     da=a/float(GRAYimg.rows*InputImg.cols);  
  25.     float D =abs(da);  
  26.     float Ma=0;  
  27.     for(int i=0;i<256;i++)  
  28.     {  
  29.         Ma+=abs(i-128-da)*Hist[i];  
  30.     }  
  31.     Ma/=float((GRAYimg.rows*GRAYimg.cols));  
  32.     float M=abs(Ma);  
  33.     float K=D/M;  
  34.     cast = K;  
  35.     return;  
  36. }  
        最后展示一下结果。

        可以发现:当亮度变低时,失焦检测显示结果为:模糊。这是由于失焦检测依赖于梯度统计,亮度变低时,会导致梯度值整体下降,从而导致检测不正确。一种更好的方法是利用亮度检测的结果,合理设定失焦检测的报警阈值,避免这种情况。
        源代码相关下载地址:http://iask.sina.com.cn/u/ish?uid=1171839324(如果不可见,表示还未通过审核,请稍后重试)。



这篇关于检测图像失焦、偏色、亮度异常的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/416927

相关文章

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

详解Python中通用工具类与异常处理

《详解Python中通用工具类与异常处理》在Python开发中,编写可重用的工具类和通用的异常处理机制是提高代码质量和开发效率的关键,本文将介绍如何将特定的异常类改写为更通用的ValidationEx... 目录1. 通用异常类:ValidationException2. 通用工具类:Utils3. 示例文

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X