69,368
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include<math.h>
#include<string>
#include<cv.h>
#include<cxcore.h>
#include<highgui.h>
using std::cout;
using std::endl;
double Func_mean2(unsigned char* BgNoiseLevel,int len)//求均值
{
double sum = 0,average = 0;
for(int i=0;i<len;i++)
{
sum += BgNoiseLevel[i];
}
average = sum/static_cast<double>(len);
return average;
}
double Func_std2(unsigned char* BgNoiseLevel,int len)//求标准差无偏估计
{
double average = Func_mean2(BgNoiseLevel,len);
double sum_squared = 0,stdeviation = 0;
for(int i=0;i<len;i++)
{
sum_squared += (BgNoiseLevel[i]-average)*(BgNoiseLevel[i]-average);
}
stdeviation = pow((sum_squared/static_cast<double>(len-1)),0.5);
return stdeviation;
}
double* RemoveGrossError(unsigned char* BgNoiseLevel, int len)//去除粗大误差点
{
int GrossErrorNum=0;
int interationNum = 0;
double result[2] = {0};
double average = Func_mean2(BgNoiseLevel,len);
double stdeviation = Func_std2(BgNoiseLevel,len);
for(int i=0;i<len;i++)
{
if((static_cast<double>(BgNoiseLevel[i])-average)>stdeviation*6)
{
BgNoiseLevel[i] = average;
++GrossErrorNum;
}
}
if(GrossErrorNum!=0/*&&interationNum<5*/) //优化次数可参考设置
{
interationNum++;
RemoveGrossError(BgNoiseLevel,len);
}
result[0] = average;
result[1] = stdeviation;
return result;
}
int main()
{
double *avgstd = new double[2];
char* imagename = new char[10];
char* outImageName = new char[10];
int inamenum = 60000;
int onamenum = 10000;
char* imagesuffix = ".bmp";
for(char ii=0;ii<20;ii++)
{
inamenum++;
onamenum++;
_itoa(inamenum,imagename,10);
_itoa(onamenum,outImageName,10);
strcpy(imagename+5,imagesuffix);
strcpy(outImageName+5,imagesuffix);
IplImage* preadimg=NULL;
unsigned char* imgdata;
int height = 0,width = 0;
preadimg = cvLoadImage(imagename,0);
imgdata = (unsigned char*)preadimg->imageData;
height = preadimg->height;
width = preadimg->width;
avgstd = RemoveGrossError(imgdata,height*width);
cout<<"average = "<<avgstd[0]<<
endl<<"stdeviation = "<<avgstd[1]<<endl;
cvSaveImage(outImageName,preadimg);
cvReleaseImage(&preadimg);
}
system("pause");
return 0;
}