OpenCV--019:直方图比较

直方图比较


是用一定的标准来判断两个直方图的相似度方法。对输入的两张图像计算得到直方图H1与H2,归一化到相同的尺度空间然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度进而比较图像本身的相似程度。


OpenCV中提供的API是:

  • 函数说明
    函数cv::comparehist使用指定的方法比较两个密集直方图或两个稀疏直方图。

    虽然该函数在处理1、2、3维密集直方图时效果良好,但它可能不适合处理高维稀疏直方图。

  • 函数声明

    double compareHist( InputArray H1, InputArray H2, int method );
    
    double compareHist( const SparseMat& H1, const SparseMat& H2, int method );
    
    
  • 函数参数
    H1:第一个参加比较的直方图
    H2:第二个参加比较的直方图
    method:比较的方法

    • 相关性比较,Correlation(method=CV_COMP_CORREL)
    • 卡方比较,Chi-Square(HISTCMP_CHISQR)=1
    • 十字交叉性比较,Intersection(method=CV_COMP_INTERSECT=2)
    • 巴氏距离比较,Bhattacharyya(method=CV_COMP_BHATTACHARYYA=3)
      在这里插入图片描述
  • 比较的步骤

    1. 首先把图像从RGB色彩空间转换到HSV色彩空间: cvtColor()
    2. 计算图像的直方:calcHist()
    3. 归一化到[0~1]之间: normalize()
    4. 进行比较: compareHist()
          Mat src1 = imread("D:/test/src1.jpg");
      	Mat src2 = imread("D:/test/src1.jpg");
      	Mat src3 = imread("D:/test/src1.jpg");
      
          //步骤一:转化成hsv空间
      	Mat hsv1,hsv2,hsv3;
      	cvtColor(src1, hsv1, COLOR_BGR2HSV);
      	cvtColor(src2, hsv2, COLOR_BGR2HSV);
      	cvtColor(src3, hsv3, COLOR_BGR2HSV);
      
      	/*
      	 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 )
      	*/
      	
      	//步骤二:直方图统计
      	int h_bins = 50;
      	int s_bins = 60;
      	int histSize[] = { h_bins,s_bins };
      
      	float h_ranges[] = { 0,180 };
      	float s_ranges[] = { 0,256 };
      	const float* rangHist[] = { h_ranges,s_ranges };
      	int channels[] = { 0,1 };
      	Mat hsv1Hist, hsv2Hist, hsv3Hist;
      	calcHist(&hsv1, 1, channels, Mat(), hsv1Hist, 2, histSize, rangHist);
      	calcHist(&hsv2, 1, channels, Mat(), hsv2Hist, 2, histSize, rangHist);
      	calcHist(&hsv3, 1, channels, Mat(), hsv3Hist, 2, histSize, rangHist);
      
      	//步骤三: 归一化
      	normalize(hsv1Hist, hsv1Hist, 0, 1, NORM_MINMAX, -1, Mat());
      	normalize(hsv2Hist, hsv2Hist, 0, 1, NORM_MINMAX, -1, Mat());
      	normalize(hsv3Hist, hsv3Hist, 0, 1, NORM_MINMAX, -1, Mat());
      
      	//步骤四: 比较直方图,并返回值
      	double cp1 = compareHist(hsv1Hist, hsv1Hist, HISTCMP_BHATTACHARYYA);
      	double cp2 = compareHist(hsv1Hist, hsv2Hist, HISTCMP_BHATTACHARYYA);
      	double cp3 = compareHist(hsv1Hist, hsv3Hist, HISTCMP_BHATTACHARYYA);
      	double cp4 = compareHist(hsv2Hist, hsv2Hist, HISTCMP_BHATTACHARYYA);
      
      	cout <<"cp1:" << cp1 << endl;
      	cout <<"cp2:" << cp2 << endl;
      	cout <<"cp3:" << cp3 << endl;
      	cout <<"cp4:" << cp4 << endl;
      
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值