1. 程式人生 > >基於Opencv計算影象的均值和方差

基於Opencv計算影象的均值和方差

實現每幅影象的每一個通道求均值和方差。
//這裡是三通道的影象

    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 該函式可以同時實現求均值和方差。