2011-11-14 21 views
1

我正在使用OpenCv在基於內容的圖像檢索中完成最終學位項目。我已經開始比較直方圖。事情是,我看到很多帖子說RGB是最差的色彩空間來操作,並且it's better to use HSV or YCrCb。但是,當我將圖像與RGB進行比較時,結果總是比使用其他色彩空間時更好。基於內容的圖像檢索的直方圖比較。不同的顏色空間(RGB,HSV等)

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

是範圍吧?

我規範化圖像,但它根本不會改變任何東西。

你認爲我應該嘗試使用其他方法嗎?

我也注意到箱子的數量非常重要,如果我改變這個值,我會得到非常不同的結果,有什麼辦法來控制它嗎?

問候

+2

我想說,你很想知道你想獲得學位文憑,但不知道如何控制直方圖中的箱子......我的建議是首先了解圖像處理的一般情況,尤其是你的主題,開始一個非常簡單的項目,學習如何編寫owm直方圖函數,然後繼續 – Sam

回答

1

我知道這並不能回答你的具體問題,而是你的更普遍的一個.... 說實話每個色彩空間是彼此非常不同。根據我的經驗,在算法中使用不同的色彩空間通常需要更改算法的工作方式以獲得有用的結果。例如,HSV空間中H信道是圓形的,即100 = 0的值,而RGB不是這種情況。例如,在YCbCr中,Y通道可能比Cr和Cb通道具有更多的重點/重要性,如果您正在處理的是一種類型的照明強度很重要的圖像,或者如果您處理的是顏色而不考慮照明強度。

其次當你說一個色彩空間比另一個色彩空間差時,你對每個色彩空間都是不公平的。他們各有其用途和侷限性。 您鏈接到哪個空間更好的文章對「穩定性」是主觀的。有很多原因可以讓你選擇另一種顏色空間。

關於你在YCbCr範圍的具體問題......我很抱歉,我不知道......我有點生疏。 :)

+0

謝謝你的回覆。我試圖在獲取直方圖之間的距離時使用一些權重。但是,我的HSV,Luv和YCrCb的結果越來越差。我起訴我會繼續使用RGB。問候 – mapetilan