Этот код разбивает изображения на меньшие плитки, чтобы найти среднее значение этих плиток и записать эти значения в файл. Я хочу рассчитать дисперсию и асимметрию тоже. пожалуйста помоги
for (int r = 0; r < img.rows; r += m)
for (int c = 0; c < img.cols; c += n)
{
Mat tile = img(Range(r, min(r + m, img.rows)),
Range(c, min(c + n, img.cols)));
Scalar MScalar,StdScalar;
meanStdDev(tile,MScalar,StdScalar);
cout<<"\n Blue Channel Avg is "<<MScalar.val[0];
cout<<"\n Green Channel Avg is "<<MScalar. val[1];
cout<<"\n Red Channel Avg is "<<MScalar. val[2];
cout<<"\nBlue channel std dev is "<<StdScalar.val[0];
cout<<"\nGreen Channel std dev is "<<StdScalar. val[1];
cout<<"\nRed Channel std dev is "<<StdScalar. val[2]<<"\n";
int m[6] = { MScalar.val[0], MScalar.val[1], MScalar.val[2], StdScalar.val[0], StdScalar.val[1], StdScalar.val[2] };
Mat M = Mat(1, 6, CV_32S, m);
outdata<< M << "\n";
cout<<M<<endl;
}
outdata<<endl;
}
}
waitKey();
return 0;
}
Цитирование из: http://en.wikipedia.org/wiki/Standard_deviation
«Другими словами, стандартное отклонение σ (сигма) является квадратным корнем дисперсии X»
То есть, если у вас есть стандартное отклонение, все, что вам нужно сделать, это std * std, чтобы получить дисперсию.
Что касается асимметрии: http://en.wikipedia.org/wiki/Skewness
Из формулы вы можете увидеть, что вам нужно сделать, это сумму значения минус среднее и разделить его на стандартное значение, все это в степени 3.
Пример для канала оттенка будет:
float skewness;
for (int x = 0; x<channelHue.rows; x++) {
for (int y = 0; y<channelHue.cols; y++) {
skewness += pow(((channelHue.at<int>(x, y) - mean)/std), 3);
}
}
Других решений пока нет …