OpenCv を使用して、コンテンツ ベースの画像検索の最終学位プロジェクトを行っています。ヒストグラムの比較を開始しました。問題は、RGB は操作するのに最悪の色空間であり、 HSV または YCrCb を使用する方が良いという投稿をたくさん見たことです。ただし、画像を RGB で比較すると、他の色空間を使用した場合よりも常に良い結果が得られます。
これは、YCrCb カラーのコードです。
void Histogram::calculateYCCHist(const cv::Mat3b& img_base, const cv::Mat1b& mask)
{
cv::Mat3f ycbcr;
cvtColor( Mat3f(img_base), ycbcr, CV_BGR2YCrCb);
int hist_size[] = {100, 100, 100};
float y_range[] = { 0, 1 }; // luma (Y) value have a nominal range from 0 to 1
float chr_range[] = { -0.5, 0.5 }; // chroma (CB and CR) values will have a nominal range from -0.5 to +0.5
const float* ranges_Y[] = {y_range};
const float* ranges_Cb[] = {chr_range};
const float* ranges_Cr[] = {chr_range};
int channel_y[] = {0};
int channel_cb[] = {1};
int channel_cr[] = {2};
// Compute histogram
calcHist(&ycbcr, 1, channel_y, mask, m_histogram_b, 1, hist_size, ranges_Y, true, false);
normalize( m_histogram_b, m_histogram_b, 0, m_histogram_b.rows, NORM_MINMAX, -1, Mat() );
calcHist(&ycbcr, 1, channel_cb, mask, m_histogram_g, 1, hist_size, ranges_Cb, true, false);
normalize( m_histogram_g, m_histogram_g, 0, m_histogram_g.rows, NORM_MINMAX, -1, Mat() );
calcHist(&ycbcr, 1, channel_cr, mask, m_histogram_r, 1, hist_size, ranges_Cr, true, false);
normalize( m_histogram_r, m_histogram_r, 0, m_histogram_r.rows, NORM_MINMAX, -1, Mat() );
}
範囲は正しいですか?
画像を正規化しますが、何も変わりません。
他の方法を試してみるべきだと思いますか?
また、ビンの数が非常に重要であり、この値を変更すると非常に異なる結果が得られることに気付きました。これを制御する方法はありますか?
よろしく