opencv_基于直方图内容的图像检索

来源:互联网 发布:医院网络咨询待遇 编辑:程序博客网 时间:2024/05/17 04:26
问题描述:
Ø基于内容的图像检索

     获取一些图像(比如大海、草原、人像等),计算这些图像的直方图,观察同类图像直方图特点,设计直方图比较函数,通过比较直方图检索相似图像。

程序如下:

#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;//逐个比较图片for(int i=1;i<6;i++){str="F:\\图片\\";//选择F:\\图片\\中的5张图片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);waitKey(0);return 0;}


0 1
原创粉丝点击