2010-11-12 85 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); 
}