【发布时间】: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] 中的值(例如:-41、14 等),根据(我想)直方图之间距离的定义(请参阅cvCompareHist )。
有没有办法标准化这些指标?
问候,维。
【问题讨论】: