#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2\opencv.hpp>
#include <iostream>
#include<string>
#include <sstream>
using namespace cv;
using namespace std;
MatND getHistogram(Mat &img)//得到直方图
{
int channels[]={0};//考察0通道
int HistSize[]={256};//直方图中元素数
float range[]={0,255};
const float *pRange[]={range};
//计算直方图,直方图结果放在hist.at<float>(i)
MatND hist;
calcHist(&img,1,channels,Mat(),hist,1,HistSize,pRange);
return hist;
}
void getHistogramImage(Mat &image ,string ImgStr)//画直方图
{
MatND hist=getHistogram(image);
double max_val,min_val;
int HistSize[]={256};
minMaxLoc(hist,&min_val,&max_val,0,0);
Mat histImg(cvSize(256*2,300),CV_8U,Scalar(0));
for(int i=0;i<HistSize[0];i++)
{
int val=int(hist.at<float>(i)/max_val*300);
line(histImg,cvPoint(i*2,300),cvPoint(i*2,300-val),cvScalar(255,255,255),1);
}
namedWindow(ImgStr);
imshow(ImgStr,histImg);
}
int main()
{
Mat imageSource=imread("imgSource.jpg",1);//读入原图
getHistogramImage(imageSource,"imgSource.jpg");//输出原图直方图
imshow("原图",imageSource);
int div=32;
MatND sourceHist=getHistogram(imageSource);
stringstream ss;
string str;
string strBest="";
double minDistance=25600;
int k=9;//图片个数
//逐个比较图片
for(int i=1;i<=k;i++)
{
str="F:\\图片\\";//选择F:\\图片\\中的k张图片
ss.clear();
ss<<str;
ss<<i;
ss<<".jpg";
ss>>str;
Mat imageDst=imread(str,1);
MatND dstHist=getHistogram(imageDst);//计算各个直方图
double distance=compareHist(sourceHist,dstHist,CV_COMP_INTERSECT);//比较直方图
// cout<<distance<<endl;
if(distance>minDistance)
{
strBest=str;
minDistance=distance;
}
}
Mat best=imread(strBest,1);
getHistogramImage(best,strBest);//输出最优图片直方图
namedWindow(strBest);
imshow("BestImage",best);
cout<<"与目标图片相似度最大的图片是"<<strBest<<endl;
waitKey(0);
return 0;
}