利用图像二维熵实现视频信号丢失检测(Signal Loss Detection)
1 图像二维熵
- 图像二维熵作为一种特征评价尺度能够反映出整个图像所含平均信息量的高低,熵值(H)越大则代表图像所包含的信息越多,反之熵值(H)越小,则图像包含的信息越少。对于图像信息量,可以简单地认为图像的边缘信息越多则图像的信息量越大。二维熵公式如下所示:
2 信号丢失检测
2.1 画面对比
由于信号丢失所产生的画面大部分均由简单的纯色或少色的人造图像,再加上“信号丢失”提示信息所构成,因此信号丢失画面的信息量与正常图像相比较低,因此其对应的二维熵值更小。例如:
上图所示的信号丢失画面由黑色屏幕加上信号丢失提示组成,画面简单,信息量较低。而正常画面具有更多的边缘信息,
相较于信号丢失画面,正常图像具有更高的信息量,其对应的二维熵值更大。
2.2 基于图像二维熵的图像信号丢失检测C++实现(使用OpenCV)
- Step1:将输入的BGR图像转换为GRAY灰度图像。
Step2:计算图像中每个像素点对应地K(本文取K=8)邻域像素均值。
Step3:统计各(像素值,K邻域像素均值)二元组出现概率。
Step4:计算图像二维熵H。
Step5:将H与预设阈值Threshold进行比较,判断图像是否存在信号丢失异常。
bool SignalLossDetection::SignalEntropyLossException(cv::Mat& inputImg, double threshold)
{
//convert the input BGR image to GRAY iamge
cv::cvtColor(inputImg, inputImg, cv::COLOR_BGR2GRAY);
inputImg.convertTo(inputImg, CV_64F);
cv::Mat imgEntropyMap= cv::Mat::zeros(256, 256, CV_64F);// 255 *256 entropy map
//calculate the mean value of K=8 neighborhood
cv::Mat meanKernal(3, 3, CV_16S);
short mean[]{ 1,1,1,
1,0,1,
1,1,1 };
meanKernal.data = (unsigned char*)mean;
cv::Mat meanMap;
cv::filter2D(inputImg, meanMap, -1, meanKernal, cv::Point(-1, -1), 0.0, cv::BORDER_REFLECT_101);
meanMap /= 8;
//calculate the (intensity, mean intensity of the K=8 neighborhood) two-tuples of the image
inputImg.convertTo(inputImg, CV_8UC1);
meanMap.convertTo(meanMap, CV_8UC1);
for(int i{0};i<meanMap.rows;++i)
for (int j{ 0 }; j < meanMap.cols; ++j) {
imgEntropyMap.at<double>(inputImg.at<uchar>(i, j), meanMap.at<uchar>(i, j))+=1;
}
//calculate the two dimensional entropy of the image
imgEntropyMap /= (inputImg.rows * inputImg.cols);
cv::Mat logMap;
cv::log(imgEntropyMap + 1e-7, logMap);//add delta=1e-7 to avoid overflow
if (-cv::sum(imgEntropyMap)[0] <= threshold)//determine whether the image have the signal loss exception
return true;
else
return false;
}
2.3 信号丢失检测结果分析
通过对图像计算二维熵值,并设置合理阈值(Threshold)便能达到信号丢失画面检测的目的。检测结果如下:
一张正常图像的二维熵值通常较高,如下图所示H=6.6348,说明图像中存在较多的边缘信息,不存在信号丢失现象。
作为最为常见的信号丢失情况,纯色背景的信号丢失图像的二维熵值极小,如下图所示H=0.3419,表明画面存在信号丢失异常。
彩色背景的信号丢失图像使用频率虽然不如纯色背景高,但也有大量的应用场景,通过计算它的二维熵值,发现其二维熵值虽然较纯色信号丢失图像更大,但依旧不高,如下图所示H=3.3039,依然可以判断图像存在信号丢失异常。
利用图像二维熵实现视频信号丢失检测(Signal Loss Detection)的更多相关文章
- 基于图像二维熵的视频信号丢失检测(Signal Loss Detection)
1 图像二维熵 图像二维熵作为一种特征评价尺度能够反映出整个图像所含平均信息量的高低,熵值(H)越大则代表图像所包含的信息越多,反之熵值(H)越小,则图像包含的信息越少.对于图像信息量,可以简单地认 ...
- 【视频开发】OpenCV中Mat,图像二维指针和CxImage类的转换
在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...
- PHP生成带logo图像二维码的两种方法
本文主要和大家分享PHP生成带logo图像二维码的两种方法,主要以文字和代码的形式和大家分享,希望能帮助到大家. 一.利用Google API生成二维码Google提供了较为完善的二维码生成接口,调用 ...
- android利用zbar二维码扫描-(解决中文乱码及扫描区域定义)
写在最前(这是对上一篇博文的问题做的更新[android利用zbar二维码扫描]) project下载 zbarLib编译project project下载0积分 bug 在2.3的系统中Hol ...
- 利用phpqrcode二维码生成类库和imagecopymerge函数制拼接图片的经验
前期准备 引入phpqrcode类库(下载地址:https://sourceforge.net/projects/phpqrcode/) PHP开启GD扩展库支持 1.利用phpqrcode生成二维码 ...
- 【opencv】 solvepnp 和 solvepnpRansac 求解 【空间三维坐标系 到 图像二维坐标系】的 三维旋转R 和 三维平移 T 【opencv2使用solvepnp求解rt不准的问题】
参考: pnp问题 与 solvepnp函数:https://www.jianshu.com/p/b97406d8833c 对图片进行二维仿射变换cv2.warpAffine() or 对图片进行二维 ...
- 利用phpqrcode二维码生成类库合成带logo的二维码并且用合成的二维码生成海报(二)
前期准备 引入phpqrcode类库(下载地址:https://download.csdn.net/download/weixin_37557729/11891240:支持彩色二维码的下载地址:htt ...
- 利用免费二维码API自动生成网址图片二维码
调用第三方接口生成二维码 官方地址:http://goqr.me/api/ 示例 https://api.qrserver.com/v1/create-qr-code/?size=180x180&am ...
- DataMatrix二维条码源码分析检测识别图像位置
发布时间:2014-10-31 DataMatrix的代码结构和QR码基本相同: 其中Detector的功能还是从原始图像中找出符号码的部分,并且进行透视转换纠正扭曲. 其解码流程与QR码差不多,关键 ...
随机推荐
- 以圆类 Circle 及立体图形类 Solid 为基础设计球类 Sphere
学习内容:以圆类 Circle 及立体图形类 Solid 为基础设计球类 Sphere 代码示例: package 实验三; import java.util.Scanner; class Point ...
- Go中rune类型浅析
一.字符串简单遍历操作 在很多语言中,字符串都是不可变类型,golang也是. 1.访问字符串字符 如下代码,可以实现访问字符串的单个字符和单个字节 package main import ( &qu ...
- java中的final与可变类型、不可变类型的关系
如果你对final和不可变类型的概念与区别有疑问的话,可以打开这篇文章.希望我的解答可以帮到您! 1.不可变类型: 什么是可变类型,什么是不可变类型呢? 首先我们看一下下面的这行代码: String ...
- Redis配置登录密码
更新记录 2022年6月14日 发布. 打开配置文件 vi /etc/redis/redis.conf 搜索来找到下面这行注释 #requirepass foobared 取消注释,把 foobare ...
- 2.2 追求并发的极致-线程概论 -《zobolの操作系统学习札记》
2.2 追求并发的极致-线程概论 为了追求程序运行之间的并发性,计算机科学家们发明了进程.为了进一步的追求进程内部的并发性,工程师们又提出了线程. 正是线程的出现,给予了程序员更多地操纵OS的自由,可 ...
- 根据数据中的key获取value值
一.测试数据准备 List<Map<String, String>> result = new ArrayList();Map<String, String> ma ...
- jetbrains 系列产品无限试用
无限试用插件 在线安装 需要添加第三方插件仓库地址 设置 -- Manage Plugins Reposition... -- + https://plugins.zhile.io plugins 中 ...
- 关于Vue在面试中常常被提到的几点(持续更新……)
1.Vue项目中为什么要在列表组件中写key,作用是什么? 我们在业务组件中,会经常使用循环列表,当时用v-for命令时,会在后面写上:key,那么为什么建议写呢? key的作用是更新组件时判断两个节 ...
- Docker 与 K8S学习笔记(二十四)—— 工作负载的使用
我们前面讲了很多关于Pod的使用,但是在实际应用中,我们不会去直接创建Pod,我们一般通过Kubernetes提供的工作负载(Deployment.DeamonSet.StatefulSet.Job等 ...
- Linux 文件权限相关知识
文件权限说明 Linux中的文件能否被访问和工具(程序)无关,和访问的用户身份有关(谁去运行这个程序) 进程的发起者(谁去运行这个程序). 进程的发起者若是文件的所有者: 拥有文件的属主权限 进程的发 ...