视频雪花故障检测

来源:互联网 发布:mac ps6序列号 编辑:程序博客网 时间:2024/04/29 19:46

雪花噪声检测原理:雪花屏为大量无规则运动的噪点,在画面中“闪烁”。具有特性:纹理深,并且有规律可循,“闪烁点”像素灰度值剧烈变化,幅值波动较大。本博客从像素值入手,直接用数学的模型来检测视频中出现的雪花噪声。

检测思路:正常图像像素的灰度值变化一般都平缓,方差较小,而雪花的“闪烁点”像素灰度值剧烈变化,灰度值跳跃性大,计算方差也偏大。窗口领域也正是把图像细分,不漏过可能的异常像素点。所以检测雪花的思路是小窗口方差法。

计算步骤如下

1.将截取到的彩色视频帧图像作灰度化 处理;

2.将灰度图像的灰度级进行压缩,量化成16级,以减少系统的计算量;

3.从视频图像左上角开始位置将它分成3x3子块窗口,接着便计算该区域内9个像素点灰度值的方差;

4.窗口遍历大小为MXN的整幅图像,则得到(M-1)*(N-1)个方差值

5.对(M-1)*(N-1)个方差取均值T,与阈值Th比较;

6.若T>Th,则为“雪花屏”。

尝试代码:效果不是很理想,有待完善

// xuehuacheck.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include "cv.h"  
#include "highgui.h"  
#include "iostream"  
#include "math.h"  


using namespace cv;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
CvCapture * capture = cvCreateFileCapture("d:\\video\\djxzBrightness.avi");
IplImage * frame = NULL;
IplImage *frimg=NULL;//frimg灰度图
cvNamedWindow("video",1);
int count = 0;
while (true)
{
count++;
frame = cvQueryFrame(capture);
if (!frame)break;
//如果是第一帧,需要申请内存,并初始化
if (count == 1)
{
frimg = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U,1);
//转化为单通道图像再处理
cvCvtColor(frame, frimg, CV_BGR2GRAY);

}
else
{
cvCvtColor(frame,frimg,CV_BGR2GRAY);

}
int width = frimg->width;//图片宽度
int height = frimg->height;//图片高度
int step = frimg->widthStep;
unsigned char *data = (uchar*)frimg->imageData;
double aver = 0;
double var = 0;
for (int  i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
aver += data[i*step + j];
}
}
aver = aver / height / width;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width;j++)
{
var += pow(data[i*step+j],2);
}
}
var = var / height / width;
var = var - (aver*aver);
var = sqrt(var);

cout << var << endl;
cvShowImage("video",frimg);


if (!(count%50))
{
printf("f:%d\n",count);
//***suanfa;
}
if (cvWaitKey(10) == 27) break;

}
cvReleaseCapture(&capture);
cvDestroyWindow("video");
return 0;
}