首页 > 代码库 > 图像检索:一维直方图+EMD距离

图像检索:一维直方图+EMD距离

EMD距离详细介绍已经在在这里已经给出。

思路:我们把一张图像的归一化的一维直方图作为signature的权重值,把色相的值作为signature。也就是一般在比较两幅图像的EMD距离时,signature是一样,只是权重值不一样。

通过以下程序,就可以得到一幅图像的signature:

#include<iostream>
using namespace std;

#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;

int main(int argc,char* argv[])
{
	Mat image,imageHsv,hist,histRow,normalHist;
	image = imread(argv[1],1);
	if(argc !=2 || !image.data)
	{
		cerr << " No image!" <<endl;
	}
	//颜色空间的转换
	cvtColor(image,imageHsv,CV_BGR2HSV);

	//一维直方图
	int hbins = 90;
	int histSize[] = {hbins};
	float hranges[] = {0.0,180.0};
	const float* ranges[] = {hranges};
	
	int channels[] ={0};
	calcHist(&imageHsv,1,channels,Mat(),hist,1,histSize,ranges,true,false);
	normalize(hist,normalHist,1,0,CV_L1,CV_32F);

	Mat signature(hbins,2,CV_32FC1);
	normalHist.copyTo(signature.col(0));
	//我们把bin的均值作为signature中的特征,放在signature的第二列
	float step = 180.0/hbins;
	for( int r=0;r < hbins; r++)
		signature.at<float>(r,1) =(step*r+(step*(r+1)-1))/2.0;
	return 0;
}