【问题标题】:Similarity Measurement between Color Image (OpenCV)彩色图像之间的相似度测量(OpenCV)
【发布时间】:2011-05-09 06:35:16
【问题描述】:

我正在处理一个 CBIR(基于内容的图像检索)项目,该项目将绘制图像的 RGB 直方图,并计算其他图像与查询图像之间的距离。

我正在使用 VS 2008 - MFC 和 OpenCV 库。我想用来计算距离的方法是欧几里得距离(ED),但不知怎的我没能算出来。

我找到了一个函数——cvCalcEMD2(),它可以帮助我计算两个直方图之间的距离。 要使用此功能,我需要为我的直方图创建签名。

这是我找到的example for creating signature

在 For 循环中,有一行我需要在我的直方图中传递:

float bin_val = cvQueryHistValue_2D(hist1, h, s);

在我的直方图函数中没有变量 h_bins 和 s_bins 之类的东西

在我的程序中,我将直方图计算/绘制成 R、G 和 B。 意味着,每张图像我都有 3 个直方图。 例如:CvHistogram *hist_red, *hist_green, *hist_blue;

如何使用直方图创建签名?

*我的 drawHistogram 函数的链接在我下面的评论中

【问题讨论】:

标签: c++ image-processing opencv histogram euclidean-distance


【解决方案1】:

这是我在项目中创建 RGB hist 签名的代码: 在我的情况下,我需要签名 tu 是一个浮点数组。

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-13
    • 2023-04-03
    • 2020-01-14
    • 2010-09-06
    • 2014-04-21
    • 1970-01-01
    • 2020-09-25
    • 2020-05-23
    相关资源
    最近更新 更多