#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
//通过直方图(HS直方图)来对比图像之间的相似度。
int main()
{
//1 载入源图。
Mat src1 = imread("风衣1.jpg");
Mat src2 = imread("风衣2.jpg");
Mat src3 = imread("风衣3.jpg");
//2 转换hsv图。
Mat grysrc1;
Mat grysrc2;
Mat grysrc3;
cvtColor(src1,grysrc1,CV_BGR2HSV);
cvtColor(src2,grysrc2,CV_BGR2HSV);
cvtColor(src3,grysrc3,CV_BGR2HSV);
//3. 截取原图下半张图。
Mat half_src1 = src1(Range(src1.rows/2,src1.rows-1),Range(0,src1.cols-1));//range()的用法。
//4. 准备计算直方图的参数。HS
int Hnumber = 60;
int Snumber = 64;
int hist_size[] = { Hnumber,Snumber };
int channels[] = {0,1};
float Hrange[] = {0,180};
float Srange[] = { 0,256 };
const float* ranges[] = { Hrange,Srange };
//5.定义各个图像的直方图。
Mat hist_src1;
Mat hist_src2;
Mat hist_src3;
Mat hist_halfsrc1;
//6.开始计算直方图。
calcHist(&src1,1,channels,Mat(),hist_src1,2,hist_size,ranges);
calcHist(&src2,1,channels,Mat(),hist_src2,2,hist_size,ranges);
calcHist(&src3,1,channels,Mat(),hist_src3,2,hist_size,ranges);
calcHist(&half_src1,1,channels,Mat(),hist_halfsrc1,2,hist_size,ranges);
//7.直方图归一化。
normalize(hist_src1,hist_src1,0,1,NORM_MINMAX);
normalize(hist_src2,hist_src2,0,1,NORM_MINMAX);
normalize(hist_src3,hist_src3,0,1,NORM_MINMAX);
normalize(hist_halfsrc1,hist_halfsrc1,0,1,NORM_MINMAX);
//8.按照四种比较标准:关系,卡方,最小数重叠(直方相交),距离。
for (int i = 0; i < 4; i++)
{
double src1_src1n=compareHist(hist_src1,hist_src1,i);
double src1_src2n=compareHist(hist_src1,hist_src2,i);
double src1_src3n=compareHist(hist_src1,hist_src3,i);
double src1_halfsrc1n=compareHist(hist_src1,hist_halfsrc1,i);
//9.输出对比结果。
cout <<endl<< "the " << i+1 << "compare:" << endl;
cout << " 1STto1ST:" << "src1-src1" << " "<<src1_src1n<<endl;
cout << " 1STto2CD:" << "src1-src2" << " "<<src1_src2n<<endl;
cout << " 1STto3RD:" << "src1-src3" << " "<<src1_src3n<<endl;
cout << " 1STtoHAF:" << "src1-half" << " "<<src1_halfsrc1n<<endl;
}
waitKey(0);
return 0;
}
可以看出,correlation 和intersection的方法比较时,越相似则结果值越大。
相反,chi—square和Bhat’tacharyya方法则是相反的,值越小越相似。