彩色图像之间的相似度测量(OpenCV)

发布于 2024-10-02 03:46:39 字数 682 浏览 8 评论 0原文

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

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

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

这是创建签名的示例 我在 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函数的链接在我下面的评论中

I'm working with a CBIR (Content-based Image Retrieval) project which will draw RGB histogram of images and also calculate the distance between other images with query image.

I'm using VS 2008 - MFC and OpenCV Library. The method I wanted to use for calculating the distance is Euclidean Distance(ED), but somehow I failed to work it out.

I found a function - cvCalcEMD2() that can help me calculate the distance between two histogram.
To use this function, i need to create signature for my histogram.

Here is an example for creating signature that I found

in the For loop, there is a line where I need to pass in my histogram:

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

and in my function for histogram don't have something like the variable h_bins and s_bins

In my program, I calculate/draw my histogram into R, G and B.
means, each image I've 3 histogram.
eg: CvHistogram *hist_red, *hist_green, *hist_blue;

How do I use my histogram to create signature?

*the link to my drawHistogram function is on my comment below

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烏雲後面有陽光 2024-10-09 03:46:39

这是我在项目中创建 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);
}

This is my code to create RGB hist signature in my project:
In my case I needed the signature tu be an array of floats.

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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文