基於Opencv計算影象的均值和方差
阿新 • • 發佈:2018-12-27
實現每幅影象的每一個通道求均值和方差。
//這裡是三通道的影象
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]);
//這裡是三通道的影象
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 該函式可以同時實現求均值和方差。