ポイントのセットがあり、それらの小さなサブセットを抽出して、二変量正規分布を計算します。その後、すべてのポイントの PDF を計算し、あるしきい値を下回る値を持つポイントを拒否することで、他のすべてのポイントがこの分布に適合するかどうかを確認します。
理論についてはここまで...
PDFには、ウィキペディアによると次の式があります。
σ は標準偏差、μ は平均で、次のように計算されます。
cv::Scalar mean;
cv::Scalar stdDev;
dataPoints = dataPoints.reshape(3); // convert 3 columns to 3 channels
cv::meanStdDev(dataPoints, mean, stdDev);
dataPoints = dataPoints.reshape(1); // convert back
meanX = mean.val[0];
meanY = mean.val[1];
sigmaX = stdDev.val[0];
sigmaY = stdDev.val[1];
dataPoints は、float の 3 つの列 (x、y、インデックス) を持つ cv::Mat です。
ρ は、次のように計算する相関係数です。
cv::matchTemplate(dataPoints.col(0), dataPoints.col(1), rho, cv::TM_CCOEFF_NORMED);
最後のステップは、これを使用して各ポイントの確率を計算することです。
double p = (1. / (2. * M_PI * sigmaX * sigmaY * sqrt(1. - pow(rho, 2))));
double e = exp((-1. / 2.) * D(x, y, rho));
double ret = p * e;
D() はマハラノビス距離を知っている限り必要ですが、OpenCV の数式は、cv::Mahalanobis(x, y, rho)
自分で計算した場合とは別の値を返します。
double cX = (x - meanX) / sigmaX;
double cY = (y - meanY) / sigmaY;
double a = (1. / (1. - pow(rho, 2)));
double b = (pow(cX, 2) + pow(cY, 2) - 2. * rho * cX * cY);
double ret = a * b;
だから今私の問題:
私が知る限り、PDF の積分は 1 で、PDF の最大値は である必要がある(meanX, meanY)
ため、σ が 0 の場合、平均での PDF は 1 になるはずです。しかし、上記の計算で 1 を超える値を取得できます。私は何を間違えますか?