赞
踩
本程序做什么?
加载基准图像和另一张做对比
将图像转换到HSV格式。
计算所有图像的H-S直方图,并归一化以便对比。
将图像直方图作对比。
显示计算所得的直方图相似度数值。
- void CompareHist()
- {
- imshow("input1", image);
- imshow("input2", temp);
-
- Mat hsv1, hsv2;
- cvtColor(image, hsv1, COLOR_BGR2HSV);
- cvtColor(temp, hsv2, COLOR_BGR2HSV);
-
- int h_bins = 60; int s_bins = 64;
- int histSize[] = { h_bins, s_bins };
- float h_ranges[] = { 0, 180 };
- float s_ranges[] = { 0, 256 };
- const float* ranges[] = { h_ranges, s_ranges };
- int channels[] = { 0, 1 };
-
- Mat hist1, hist2;
- calcHist(&hsv1, 1, channels, Mat(), hist1, 2, histSize, ranges, true, false);
- calcHist(&hsv2, 1, channels, Mat(), hist2, 2, histSize, ranges, true, false);
-
- normalize(hist1, hist1, 0, 1, NORM_MINMAX, -1, Mat());
- normalize(hist2, hist2, 0, 1, NORM_MINMAX, -1, Mat());
-
- //4 种比较方法
- for (int i = 0; i < 4; i++)
- {
- int compare_method = i;
- double src1_src2 = compareHist(hist1, hist2, compare_method);
- qDebug() << " Method" << i << ": src1_src2:" << src1_src2;
- printf(" Method [%d] : src1_src2 : %f \n", i, src1_src2);
- }
- waitKey(0);
- }
- void calcHist(const Mat * images,
- int nimages,
- const int* channels,
- InputArray mask,
- OutputArray hist,
- int dims,
- const int* histSize,
- const float** ranges,
- bool uniform = true,
- bool accumulate = false);
images:输入的图像的指针;
nimages:输入图像个数;
channels:需要统计直方图的第几通道;
mask:掩模,mask必须是一个8位(CV_8U)的数组并且和images的数组大小相同;
hist:直方图计算的输出值;
dims:输出直方图的维度(由channels指定);
histSize:直方图中每个dims维度需要分成多少个区间(如果把直方图看作一个一个竖条的话,就是竖条的个数);
ranges:统计像素值的区间;
uniform = true:是否对得到的直方图数组进行归一化处理;
accumulate = false:在多个图像时,是否累积计算像素值的个数;
方法1:Correlation ( CV_COMP_CORREL )
相关性比较,取值范围[0,1],越接近1,直方图相似度越高
方法2:Chi-Square ( CV_COMP_CHISQR )
卡方检验,取值范围[0,1],越接近0,直方图相似度越高
方法3:Intersection ( method=CV_COMP_INTERSECT )
相交,取值高,直方图相似度越高
方法4:Bhattacharyya distance ( CV_COMP_BHATTACHARYYA )
巴氏距离在直方图比较中效果最佳,完全匹配为1,完全不匹配为0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。