【问题标题】:Compare histograms in OpenCV and normalize similarity index比较 OpenCV 中的直方图并归一化相似度指数
【发布时间】:2013-08-07 15:43:06
【问题描述】:

我正在使用最新版本的 OpenCV 框架 (2.4.6.0) 进行图像处理。 我必须比较两个直方图才能获得集合[0;1] 中的float,此时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 )。

有没有办法标准化这些指标?

问候,维。

【问题讨论】:

    标签: c opencv histogram


    【解决方案1】:

    为了解决此问题,我使用 Bhattacharyya 距离 (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 方法仅适用于标准化直方图。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-03-24
        • 2012-04-22
        • 1970-01-01
        • 2015-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-09
        • 2018-02-06
        相关资源
        最近更新 更多