我正在使用最新版本的 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]
(例如:-41
、14
等),根据(我想)直方图之间距离的定义(参见 参考资料cvCompareHist
)。
有没有一种方法可以标准化这些指数?
问候,六。