次のように、ヒストグラムを計算するための 3 次元マトリックスを作成しました。
// Histogram of HSV image
int const hue_bins = 180; //
int const sat_bins = 256; //
int const val_bins = 4; // Only four bins for V channel!
float const hue_range[2] = {0, 180};
float const sat_range[2] = {0, 256};
float const val_range[2] = {0, 256};
int const hsv_sizes[] = {hue_bins, sat_bins, val_bins};
cv::Mat1f m_tone_frequences(3, hsv_sizes, 0.);
それから私は使用しています
cv::calcHist
( &image, 1, channels, mask, histogram
, num_channels, hsv_sizes, ranges);
...
cv::calcBackProject
( &image_f, 1, channels, histogram
, backproject, hsv_sizes, 1.0);
正常に動作しているようです (コードは簡略化されています)。
ヒストグラムは単一の画像からサンプリングされるため、サンプリングの問題が発生する可能性があります (対象オブジェクトの色分布が狭い)。そこで、ガウス平滑化を「値」ヒストグラム平面に適用したいと思います。ヒストグラムの行を取得しようとしましたが、別の 3D マットが得られます:
cv::Mat1f hrow = histogram.row(0);
// hrow.dims ==3 && hrow.rows == -1 && hrow.cols == -1
私はそれを処理することについての考えを持っていません。
このアクションは非常に簡単に実行できるはずなので、この問題を解決するのに途方に暮れています。
どんなアドバイスでも大歓迎です。