0

我正在使用最新版本的 OpenCV 框架 ( 2.4.6.0) 进行图像处理。我必须比较两个直方图才能获得float集合中的a [0;1],什么时候0是相似度的最小值和1最大值。

我的代码如下:

CvHistogram* create_histogram( IplImage** image, IplImage* mask )
{
    int num_bins = 8;
    float xranges[] = { 0, 255 };
    float* ranges[] = { xranges, xranges, xranges };
    int hist_size[] = { num_bins, num_bins, num_bins };
    CvHistogram* hist = cvCreateHist(3, hist_size, CV_HIST_ARRAY, ranges, 1);
    cvCalcHist(image, hist, 0, mask);
    cvNormalizeHist(hist, 1);
    return hist;
}

void set_histogram( T_FRAME &frame, T_FRAME &mask, T_APPEARANCE &appearance, const T_RECT rect )
{
    cvSetImageROI(frame, rect);
    cvSetImageROI(mask, rect);
    IplImage* b = cvCreateImage(cvGetSize(frame), frame->depth, 1);
    IplImage* g = cvCreateImage(cvGetSize(frame), frame->depth, 1);
    IplImage* r = cvCreateImage(cvGetSize(frame), frame->depth, 1);
    cvSplit(frame, b, g, r, NULL);
    IplImage* bgr_plane[]   = { b, g, r };
    CvHistogram* histogram  = create_histogram(bgr_plane, mask);
    appearance.hist = histogram;
    cvReleaseImage(&b);
    cvReleaseImage(&g);
    cvReleaseImage(&r);
    cvResetImageROI(frame);
    cvResetImageROI(mask);
}

笔记:typedef IplImage* T_FRAME;

因此,我创建了两个外观模型并比较它们的直方图:

void create_appearence( T_FRAME &frame, T_FRAME &mask, T_APPEARANCE &appearance, const T_RECT rect )
{
    set_histogram(frame, mask, appearance, rect);
}

float get_similarity( T_APPEARANCE &appearance_A, T_APPEARANCE &appearance_B )
{
    return cvCompareHist(appearance_A.hist, appearance_B.hist, CV_COMP_CHISQR);
}

作为输出,程序不返回值[0;1](例如:-4114等),根据(我想)直方图之间距离的定义(参见 参考资料cvCompareHist)。

有没有一种方法可以标准化这些指数?

问候,六。

4

2 回答 2

1

为了解决这个问题,我使用了Bhattacharyya distance ( CV_COMP_BHATTACHARYYA) 而不是Chi-Square

float get_similarity( T_APPEARANCE &appearance_A, T_APPEARANCE &appearance_B )
{
    return cvCompareHist(appearance_A.hist, appearance_B.hist, CV_COMP_BHATTACHARYYA);
}

因此,根据需要cvCompareHist返回 中的值[0;1]

请注意,该方法CV_COMP_BHATTACHARYYA仅适用于标准化直方图。

于 2013-08-09T22:08:31.517 回答
0

您可以使用类似 sigmoid 的函数。它们可以将任何值区间压缩为 [0;1]。

于 2013-08-06T17:12:18.673 回答