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

问题描述:
Ø 基于内容的图像检索

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

程序如下:

#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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值