Измерение сходства между цветным изображением (OpenCV) - PullRequest
4 голосов
/ 12 ноября 2010

Я работаю с проектом CBIR (Content-image Image Retrieval), который будет рисовать гистограмму RGB изображений, а также рассчитывать расстояние между другими изображениями с помощью изображения запроса.

Я использую VS 2008 - MFC и OpenCV Library. Метод, который я хотел использовать для расчета расстояния, - это Евклидово расстояние (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 находится на моем комментарии ниже

1 Ответ

0 голосов
/ 27 января 2011

Это мой код для создания RGB-подписи в моем проекте: В моем случае мне понадобилась подпись, чтобы быть массивом чисел с плавающей точкой.

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