2010-11-12 76 views
3

我正在使用CBIR(基於內容的圖像檢索)項目,該項目將繪製圖像的RGB直方圖,並計算其他圖像與查詢圖像之間的距離。彩色圖像之間的相似性測量(OpenCV)

我使用VS 2008 - MFC和OpenCV庫。我想用來計算距離的方法是歐幾里得距離(ED),但不知何故,我沒有解決這個問題。

我發現了一個函數--cvCalcEMD2(),它可以幫助我計算兩個直方圖之間的距離。 要使用此功能,我需要爲我的直方圖創建簽名。

下面是一個example for creating signature,我發現

在for循環

,有一條線,我需要在我的直方圖傳遞:

浮子bin_val = cvQueryHistValue_2D(HIST1,H,S);

,並在我的直方圖功能沒有像變量h_bins和s_bins

在我的計劃,我計算/得出我的柱狀圖爲R,G和B 手段,每個圖像我已經3直方圖。例如:CvHistogram * hist_red,* hist_green,* hist_blue;

如何使用我的直方圖創建簽名?

*鏈接到我的drawHistogram功能是下面

+0

鏈接到我的代碼計算/繪製RGB直方圖:http://www.slideshare.net/irylee/histogram-5758527 – iry 2010-11-12 19:30:56

回答

0

我的評論這是我的代碼在我的項目創建RGB HIST簽名: 對我來說,我需要簽名恩是float數組。

void makeColorSign(const IplImage* img,float** colorSign) { 
    unsigned int* N = Params::colorSignSize; 
    float* sign = (float*)malloc(N[0]*N[1]*3*sizeof(float)); 
    IplImage* s = cvCreateImage(cvSize(N[0],N[1]),img->depth,img->nChannels); 
    cvResize(img,s,CV_INTER_NN); 
    RgbImage rgb(s); 
    for(unsigned int y=0; y<N[1]; ++y) { 
     for(unsigned int x=0; x<N[0]; ++x) { 
      unsigned int coord = (y*N[1]+x)*3; 
      sign[coord] = rgb[y][x].r; 
      sign[coord+1] = rgb[y][x].g; 
      sign[coord+2] = rgb[y][x].b; 
     } 
    } 
    *colorSign = sign; 
    cvReleaseImage(&s); 
}