opencv学习笔记(二十六)直方图比较

1.概念介绍

对输入的两张图像计算得到直方图H1H2,归一化到相同的尺度空间,然后可以通过计算H1H2的之间的距离得到两个直方图的相似程度进,而比较图像本身的相似程度。Opencv提供的比较方法有四种:

(1)Correlation 相关性比较(CV_COMP_CORREL

计算规则:其中,

N为bin的个数。两幅图像越相似则计算出的值接近1。

 

(2)Chi-Square 卡方比较(CV_COMP_CHISQR)

计算规则:两幅图像越相似则计算出的值接近值越小。

 

(3)Intersection 十字交叉性(CV_COMP_INTERSECT)

计算规则:

 

(4)Bhattacharyya distance 巴氏距离(CV_COMP_BHATTACHARYYA)

计算规则:

2.步骤与API

(1)步骤

首先把图像从RGB色彩空间转换到HSV色彩空间cvtColor

计算图像的直方图,然后归一化到[0~1]之间calcHistnormalize;

使用上述四种比较方法之一进行比较compareHist

(2)compareHist(InputArray h1, InputArray H2,int method

h1:第一幅图直方图数据

h2:第二幅图直方图数据

method:上述方法中的1个

3.代码实现

#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;

char inputName[] = "src1";
char outputName[] = "src2";
int main()
{
	Mat src1, src2;
	src1 = imread("D:/VS project/Image/people.jpg");
	src2 = imread("D:/VS project/Image/people1.png");
	if (src1.empty() || src2.empty())
	{
		cout << "找不到图像" << endl;
		return -1;
	}
	namedWindow(inputName, CV_WINDOW_AUTOSIZE);
	namedWindow(outputName, CV_WINDOW_AUTOSIZE);
	imshow(inputName, src1);
	imshow(outputName, src2);
	//转到HSV色彩空间
	cvtColor(src1, src1, CV_BGR2HSV);
	cvtColor(src2, src2, CV_BGR2HSV);

	//计算直方图
	int h_bins = 50, s_bins = 60;//定义HS2个通道的级数
	int histsize[] = { h_bins, s_bins };//直方图级数
	const float h_range[] = { 0,180 };//H值域范围
	const float s_range[] = { 0,255 };//S值域范围
	const float* range[] = { h_range,s_range };
	int channels[] = { 0,1 };
	MatND src1Hist, src2Hist;//定义多维数组存放直方图结果
	calcHist(&src1, 1, channels, Mat(), src1Hist, 2, histsize, range, true, false);
	normalize(src1Hist, src1Hist, 0, 1, NORM_MINMAX, -1,Mat());
	calcHist(&src2, 1, channels, Mat(), src2Hist, 2, histsize, range, true, false);
	normalize(src2Hist, src2Hist, 0, 1, NORM_MINMAX, -1,Mat());

	//比较直方图
	double src1src1 = compareHist(src1Hist, src1Hist, CV_COMP_BHATTACHARYYA);//巴士距离
	double src1src2 = compareHist(src1Hist, src2Hist, CV_COMP_CORREL);//相关性比较

	cout << src1src1 << endl << src1src2;
	
	


	waitKey(0);
	return 0;
}

4.运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值