1

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() );
 }

範囲は正しいですか?

画像を正規化しますが、何も変わりません。

他の方法を試してみるべきだと思いますか?

また、ビンの数が非常に重要であり、この値を変更すると非常に異なる結果が得られることに気付きました。これを制御する方法はありますか?

よろしく

4

1 に答える 1

1

これはあなたの特定の質問ではなく、より一般的な質問の答えになる可能性があることを理解しています....正直に言うと、各色空間は互いに大きく異なります。私の経験では、アルゴリズムで異なる色空間を使用すると、通常、有用な結果を得るためにアルゴリズムの動作を変更する必要があります。この例としては、HSV 空間で H チャネルが円形、つまり 100 = 0 の値であることが挙げられますが、これは RGB には当てはまりません。たとえば、YCbCr では、イルミネーションの強さが重要な 1 つのタイプの画像を扱っている場合、またはイルミネーションに関係なく色を扱っている場合はその逆の場合、Y チャネルは Cr および Cb チャネルよりも強調/重要性が高い可能性があります。力。

第二に、ある色空間が別の色空間よりも悪いと言うとき、あなたはそれぞれに不公平です. それぞれに用途と制限があります。どのスペースが優れているかにリンクする記事は、「安定性」に主観的です。別の色空間よりも 1 つの色空間を選択する理由は多数あります。

YCbCr範囲に関するあなたの特定の質問について...申し訳ありませんが、わかりません...これについては少し錆びています。:)

于 2011-11-16T16:22:31.233 に答える