实现每幅图像的每一个通道求均值和方差。
//这里是三通道的图像
for(i=0;i<3;i++) //求均值
{
m[i]=0;
for(x=0;x<src->height;x++)
{
uchar *ptr=(uchar*)(src->imageData+x*src->widthStep);//每一行的起点wisthstep是以字节为单位的
for(y=0;y<src->width;y++)
{
m[i]+=ptr[3*y+i];
}
}
m[i]/=npixs;
}
for(i=0;i<3;i++) //求标准差
{
d[i]=0;
for(x=0;x<src->height;x++)
{
uchar *ptr=(uchar*)(src->imageData+x*src->widthStep);
for(y=0;y<src->width;y++)
{
d[i]+=(ptr[3*y+i]-m[i])*(ptr[3*y+i]-m[i]);
}
}
d[i]/=npixs;
d[i]=sqrt(d[i]);
}
其实在opencv中有现成的函数可以计算平均值和标准差
CvScalar cvAvg(const CvArr* arr,constCvArr* mask =NULL);//计算mask非零位置的所有元素的平均值,如果是图片,则单独计算每个通道上的平均值,如果COI设置了,只计算该COI通道的平均值。对于多通道的图像可以通过设置COI实现求单独通道的平均值。
void cvAvgSdv(const CvArr* arr, CvScalar* mean, CvScalar* std_dev,const CvArr* mask=NULL);//计算各通道的平均值,标准差,支持COI 该函数可以同时实现求均值和方差。