基于内容的图像检索的直方图比较。不同的色彩空间(RGB,HSV等)

时间:2011-11-14 22:52:41

标签: image-processing opencv histogram image-comparison cbir

我正在使用OpenCv进行基于内容的图像检索的最终学位项目。我已经开始比较直方图了。问题是我看过很多帖子说RGB是最差的色彩空间,it's better to use HSV or 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 个答案:

答案 0 :(得分:1)

我意识到这可能无法解答您的具体问题,而是您更普遍的问题.... 说实话,每个颜色空间彼此非常不同。根据我在算法中使用不同颜色空间的经验,通常需要更改算法的工作方式以获得有用的结果。这样的一个例子是在HSV空间中H通道如何是圆形的,即值100 = 0,这不是RGB的情况。例如,在YCbCr中,Y通道可能比Cr adn Cb通道具有更多的重点/重要性,如果您正在处理一种类型的图像,其中照明强度是重要的,或者如果您处理颜色而不管照明是相反的方式强度。

其次,当你说一个颜色空间比另一个颜色空间更差时,你对每个颜色空间都不公平。他们每个人都有自己的用途和局限。 你链接到哪个空间更好的文章是“稳定性”的主观。您可能选择颜色空间而不是另一个颜色空间的原因有很多。

关于YCbCr范围的具体问题......对不起,我不知道......我有点生疏了。 :)

相关问题