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

2023-05-16


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

        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(如果不可见,表示还未通过审核,请稍后重试)。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测图像失焦、偏色、亮度异常 的相关文章

  • Ubuntu18.04 vnc灰屏问题

    vnc安装完以后 xff0c 用客户端登录发现只有5901端口可用 xff0c 但是其他端口登录上去以后都是灰屏的 查找了一下 xff0c 需要修改配置文件 vnc xstartup为如下内容 xff1a bin bash export d
  • 安装docker

    1 查看docker安装目录 whereis docker docker usr bin docker etc docker usr libexec docker usr share man man1 docker 1 gz 2 查询运行文
  • 关于PiBOT使用的一些问题汇总--ing

    xff1a 多机通讯是按照教程设置环境变量ROS MASTER URI 初始化 pibot init env sh xff0c 使用rostopic已经能够查看 xff0c 但是主机PC无法启动launch 原因 xff1a 个人测试是需要
  • ubuntu 19.10系统解决E: 仓库 “http://ppa.launchpad.net/webupd8team/java/ubuntu eoan Release” 没有 Release 文件。

    在终端换源后遇到E 仓库 http ppa launchpad net webupd8team java ubuntu eoan Release 没有 Release 文件 问题 解决方法 xff1a 将对应的ppa删除即可 第一步 xff
  • 使用org-mode生成晨检报告

    原文地址 https lujun9972 github io blog 2020 04 10 使用org mode生成晨检报告 index html 我们设置了每天8点多自动进行调用一次晨检脚本 xff0c 该脚本会将检查的一些数据存入本地
  • 使用Pi-hole屏蔽广告

    原文地址 https www lujun9972 win blog 2020 12 05 使用pi hole屏蔽广告 index html 目录 获取Pi的对外IP地址安装Pi hole配置DNS配置拦截域名 获取Pi的对外IP地址 我们一
  • 笑话理解之Mature

    原文地址 https www lujun9972 win blog 2020 12 09 笑话理解之mature index html 目录 The difference between government bonds and men T
  • 笑话理解之Hearing

    原文地址 https www lujun9972 win blog 2020 12 09 笑话理解之hearing index html 目录 The Hearing Problem The Hearing Problem In a chu
  • Emacs 作为 MPD 客户端

    原文地址 https www lujun9972 win blog 2022 06 26 emacs 作为 mpd 客户端 index html 今天才知道 xff0c Emacs居然内置了一个 mpc el 可以将 Emacs 转换为 M
  • 编译SONiC交换机镜像(转,参考2)

    sonic buildimage 编译SONiC交换机镜像 描述 以下是关于如何为网络交换机构建 ONIE 兼容网络操作系统 xff08 NOS xff09 安装程序镜像的说明 xff0c 以及如何构建在NOS内运行的Docker镜像 请注
  • Emacs 作为 MPD 客户端

    原文地址 https www lujun9972 win blog 2022 06 26 emacs 作为 mpd 客户端 index html 今天才知道 xff0c Emacs居然内置了一个 mpc el 可以将 Emacs 转换为 M
  • 使用 calc 计算保险实际收益率

    原文地址 https www lujun9972 win blog 2022 08 10 使用 calc 计算保险实际收益率 index html 今天某银行的客户经理来推销一个 增额终身寿险 xff0c 号称是能锁定3 5 的收益率 具体
  • Emacs使用Deft管理笔记

    1 Deft介绍 Deft是一款写作和管理纯文本格式笔记的工具 通过它可以快速的查到或新建笔记 Deft的下载地址是Deft 也可以通过浏览或者拷贝git仓库 xff1a git clone git jblevins org git def
  • linux挂载samba文件系统的方法

    1 手工挂载 有两个命令可以用来手工挂载samba文件系统 xff0c 一个是mount xff0c 一个是smbmount 1 1 使用mount命令挂载 mount就是用于挂载文件系统的 xff0c SMB做为网络文件系统的一种 xff
  • DB2里面如何进行快速分页?就像mysql的limit之类的

    从百度知道里看到的 xff0c 记录下来以防忘记了 只查询前10行 fetch first 10 rows only SELECT SALE DATE SUM SALE MONEY AS SUM MONEY FROM SALE REPORT
  • linux时间与Windows时间不一致的解决

    转载至http goodluck1982 blog sohu com 138950694 html 一 首先要弄清几个概念 xff1a 1 系统时间 与 硬件时间 系统时间 一般说来就是我们执行 date命令看到的时间 xff0c linu
  • java list中删除元素用remove()报错的fail-fast机制原理以及解决方案

    java list中删除元素用remove 报错的fail fast机制原理以及解决方案 现在有一个list 有6个元素 xff0c 值分别是1 5 5 8 5 10 xff0c 现需要删除值为5的元素 第一种 import java ut
  • PDF 缩略图无法正常显示 解决办法

    先交代一下配置 xff1a win10 43 福晰阅读器 43 Adobe Acrobat DC 有时候PDF无法显示缩略图 xff0c 像下面这样子 提前设置好两个点 xff1a 1 从不显示缩略图的复选框的勾 xff0c 取消 xff0
  • xmanager7开启Xstart 连接远程ubuntu虚拟机

    在想要建立连接的ubuntu虚拟机上安装xterm xff0c 此处我是用的是ubuntu20 04 sudo apt install xterm span class token operator span y 然后打开xmanager7

随机推荐