比较OpenCV中的直方图并规范化相似性指数

时间:2013-08-06 14:50:02

标签: c opencv histogram

我正在使用最新版本的OpenCV框架(2.4.6.0)进行图像处理。 我需要比较两个直方图以获得集float中的[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)。

是否有规范这些指数的方法?

问候,Vi。

2 个答案:

答案 0 :(得分:1)

为了解决这个问题,我使用的是 Bh​​attacharyya距离CV_COMP_BHATTACHARYYA),而不是卡方

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仅适用于规范化的直方图。

答案 1 :(得分:0)

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