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

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

相关文章

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

Java报NoClassDefFoundError异常的原因及解决

《Java报NoClassDefFoundError异常的原因及解决》在Java开发过程中,java.lang.NoClassDefFoundError是一个令人头疼的运行时错误,本文将深入探讨这一问... 目录一、问题分析二、报错原因三、解决思路四、常见场景及原因五、深入解决思路六、预http://www

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件