Сравнение гистограммы для поиска изображений на основе содержимого.Различные цветовые пространства (RGB, HSV и т. Д.) - PullRequest
1 голос
/ 15 ноября 2011

Я делаю окончательный проект в области поиска изображений с использованием контента с использованием 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() );
 }

Верны ли диапазоны?

Я нормализую изображение, но оно ничего не меняет.

Как вы думаете, я должен попытаться использовать другие методы?

Я также заметил, что количество бинов имеет большое значение, и если я изменю это значение, я получу очень разные результаты, есть ли способ контролировать это?

Привет

1 Ответ

1 голос
/ 16 ноября 2011

Я понимаю, что это может не ответить на ваш конкретный вопрос, а скорее на ваш более общий вопрос .... Честно говоря, каждое цветовое пространство сильно отличается друг от друга. По моему опыту использование другого цветового пространства в вашем алгоритме обычно требует изменений в том, как алгоритм работает, чтобы получить полезные результаты. Примером этого может быть то, как в пространстве HSV канал H является круглым, то есть значение 100 = 0, что не относится к RGB. Например, в YCbCr канал Y может иметь больший акцент / важность, чем каналы Cr adn Cb, если вы работаете с одним типом изображений, для которых важна сила освещения, или наоборот, если вы работаете с цветами независимо от освещения. прочность.

Во-вторых, когда вы говорите, что одно цветовое пространство хуже другого, вы несправедливы по отношению к каждому. У каждого из них есть свои применения и свои ограничения. Статья, на которую вы ссылаетесь, на каком пространстве лучше, субъективна «стабильности». Есть много причин, по которым вы можете выбрать цветовое пространство над другим.

По вашему конкретному вопросу о диапазонах YCbCr ... Извините, я не знаю ... Я немного заржавел в этом. :)

...