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

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;  
}

最后展示一下结果。

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

转载于:https://www.cnblogs.com/huty/p/8517225.html

【视频开发】图像清晰度评价方法相关推荐

  1. 图像清晰度评价15种方法对比

    在无参考图像的质量评价中,图像的清晰度是衡量图像质量优劣的重要指标,它能够较好的与人的主观感受相对应,图像的清晰度不高表现出图像的模糊.本文针对无参考图像质量评价应用,对目前几种较为常用的.具有代表性 ...

  2. 无参考图像的清晰度评价方法 (图像清晰度的评价指标)

    无参考图像的清晰度评价方法 from: http://nkwavelet.blog.163.com/blog/static/227756038201461532247117 在无参考图像的质量评价中, ...

  3. 无参考图像的清晰度评价方法

    在无参考图像的质量评价中,图像的清晰度是衡量图像质量优劣的重要指标,它能够较好的与人的主观感受相对应,图像的清晰度不高表现出图像的模糊.本文针对无参考图像质量评价应用,对目前几种较为常用的.具有代表性 ...

  4. 基于强边缘有效性统计的图像清晰度评价

    摘要 图像清晰度评价是图像质量评价中的一个重要组成部分,对于自动对焦.图像压缩.视频封面提取等应用具有重要意义.目前图像清晰度评价可分为有参考图像清晰度评价和无参考图像清晰度评价[1]. 对于无参考清 ...

  5. 无参考图像清晰度评价

    转自: http://nkwavelet.blog.163.com/blog/static/227756038201461532247117 在无参考图像的质量评价中,图像的清晰度是衡量图像质量优劣的 ...

  6. 相机自动对焦 OpenCV 图像清晰度评价

    原文:https://blog.csdn.net/dcrmg/article/details/53543341 OpenCV 图像清晰度评价(相机自动对焦) 版权声明:本文为博主原创文章,转载请注明出 ...

  7. opencv系列-图像清晰度评价

    opencv系列-图像清晰度评价 1,换了opencv3.4,用来测试 2,opencv好评呀 图像清晰度评价算法有很多种,在空域中,主要思路是考察图像的领域对比度,即相邻像素间的灰度特征的梯度差:在 ...

  8. OpenCV 图像清晰度评价算法(相机自动对焦)

    相机的自动对焦要求相机根据拍摄环境和场景的变化,通过相机内部的微型驱动马达,自动调节相机镜头和CCD之间的距离,保证像平面正好投影到CCD的成像表面上.这时候物体的成像比较清晰,图像细节信息丰富. 相 ...

  9. 一种全景视频的主观质量评价方法(译)

    A subjective visual quality assessment method of panoramic videos ICME 2017 abstract 与传统的2D视频不同,在头戴式 ...

最新文章

  1. 北航学长:DCIC 2021的算法方案讲解
  2. Docker+Jenkins持续集成环境(1)使用Docker搭建Jenkins+Docker持续集成环境
  3. Reporting Services 安装的备份和还原操作
  4. R语言:异常数据处理
  5. 浮小麦升浮之气的本质
  6. 『ACM--数据结构--字典树』信息竞赛进阶指南--Tire树
  7. 开源 java CMS - FreeCMS2.6 Web页面信息采集
  8. 通过Java,Spring Boot应用程序将Gmail用作SMTP服务器
  9. 基于Echarts+HTML5可视化数据大屏展示—设备环境监测平台大数据平台
  10. MDaemon邮件服务器在WorldClient新增的聊天功能
  11. 易筋SpringBoot 2.1 | 第九篇:SpringBoot使用Redis内存数据库
  12. word-vba应用
  13. Process Monitor工具找网吧广告
  14. 如何变得聪明15种方法_变得聪明是什么感觉?
  15. cesium-Web页面优化总结
  16. 手机话费充值页面HTMLcss3+html5模板
  17. android 打开屏幕,android打开关闭屏幕
  18. 怎样保护计算机桌面不被更改,Win7屏幕保护程序不能修改怎么办 win7无法设置电脑屏幕保护程序如何解决...
  19. mysql assoc什么意思_mysql_fetch_assoc 报错
  20. java实验总结与心得_java实验心得体会范例精选

热门文章

  1. OSPF:MTU不一致导致的邻接关系问题
  2. 基于MATLAB FDATOOL的CIC滤波器设计
  3. PCB板上字母表示的含义
  4. 二相并行FIR滤波器的matlab及使用FIR IP 核的FPGA实现
  5. 收发机中数字中频的设计
  6. texlive环境运行WinEdt系统找不到指定的文件
  7. pywebio和stylecolud 做的词云gui
  8. Kotlin如何避免“!!”(非空断言)
  9. c++ ado 程序终止时崩溃
  10. 云计算将成为媒体融合发展与数字化变革的加速剂