前言
在中详细讲解了图像直方图,图像直方图比较是度量两张图像相似度的一种手段。为了比较两个直方图(H1和H2),首先我们必须选择一个度量(d(H1,H2))来表示这两个直方图的匹配程度。OpenCV提供了4种不同的指标来计算匹配:
相关性Correlation ( HISTCMP_CORREL):
N是N是直方图bin的总数。
Chi-Square ( HISTCMP_CHISQR)
Intersection ( method=HISTCMP_INTERSECT)
Bhattacharyya distance ( HISTCMP_BHATTACHARYYA)
opencv 函数支持
函数原型:
CV_EXPORTS_W double compareHist( InputArray H1, InputArray H2, int method );
参数说明:
H1:第一个要比较直方图。
H2: 第二个要直方图,与H1相同大小。
method :比较的方法,参见#HistCompMethods,对于Correlation and Intersection方法,度量值越高,匹配越准确。Square 和Bhattacharyya distance 则相反。
代码示例:
cv::Mat image = cv::imread("D:\\QtProject\\Opencv_Example\\Hist\\Hist.png", cv::IMREAD_GRAYSCALE);
if (image.empty()) {
cout << "Cannot load image" << endl;
return;
}
imshow("image",image);
const int bins[1] = { 256 };
float hranges[2] = { 0,255 };
const float* ranges[1] = { hranges };
Mat hist;
// 计算直方图
calcHist(&image, 1, 0, Mat(), hist, 1, bins, ranges);
normalize(hist, hist, 0, 1, NORM_MINMAX, -1, Mat()); //将数据规皈依到0和1之间
cv::Mat imageCvert;
image.convertTo(imageCvert, -1, 1, 50);
imshow( "imageCvert", imageCvert);
Mat histCompare;
calcHist(&imageCvert, 1, 0, Mat(), histCompare, 1, bins, ranges);
normalize(histCompare, histCompare, 0, 1, NORM_MINMAX, -1, Mat()); //将数据规皈依到0和1之间
double CORREL = compareHist( hist, histCompare, HISTCMP_CORREL );
double CHISQR = compareHist( hist, histCompare, HISTCMP_CHISQR );
double INTERSECT = compareHist( hist, histCompare, HISTCMP_INTERSECT );
double BHATTACHARYYA = compareHist( hist, histCompare, HISTCMP_BHATTACHARYYA );
cout << "HISTCMP_CORREL:" << CORREL<<endl
<< "HISTCMP_CHISQR:" << CHISQR << endl
<< "HISTCMP_INTERSECT:" << INTERSECT << endl
<< "HISTCMP_BHATTACHARYYA:" << BHATTACHARYYA << endl;
比较的两张图像:
运行结果: