我正在使用最新版本的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]
中的值(例如:-41
,14
等),根据(我想),它之间的距离定义直方图(见cvCompareHist
)。
是否有规范这些指数的方法?
问候,Vi。
答案 0 :(得分: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
仅适用于规范化的直方图。
答案 1 :(得分:0)
您可以使用类似sigmoid的函数。他们可以将任何值的间隔压缩为[0; 1]。