EMD距离具体介绍已经在在这里已经给出。

思路:我们把一张图像的归一化的一维直方图作为signature的权值,也就是一般在比較两幅图像颜色直方图的EMD距离时,每一行的坐标一样,仅仅是权重值不一样。

通过下面程序,就能够得到一幅图像的signature:

<pre name="code" class="cpp">#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,normalHist;
image = imread(argv[1],1);
if(argc !=2 || !image.data)
{
cerr << " No image!" <<endl;
return -1;
}
//颜色空间的转换
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的第二列
for( int r=0;r < hbins; r++)
signature.at<float>(r,1) =float(r);
return 0;
}

第二步:做检索

<pre name="code" class="cpp">#include<iostream>
#include<fstream>
#include<map>
#include<string>
using namespace std; #include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv; Mat signature(const Mat & src);
int main(int argc,char* argv[])
{
//定义文件流,仅仅能读取
ifstream inPutFile(argv[1],ios::in);
if(! inPutFile)
{
cerr <<"File Open Erro !"<<endl;
return -1;
} //读取文件流中的每一行,并赋值给fileName,形成查询数据库
string fileName;
Mat image,imageSignature,sourceSignature;
vector<Mat> signatures; map<int,string> index;//图像的索引
index.clear();
int number = 0;
signatures.clear();
while(getline(inPutFile,fileName))
{
index.insert(pair<int,string>(number,fileName));
number++;
image = imread(fileName,1);
imageSignature = signature(image);
signatures.push_back(imageSignature);
} //待搜索的图像
number = 0;
Mat imageSource = imread(argv[2],1);
sourceSignature = signature(imageSource);
vector<Mat>::iterator iter;
map<float,int> distance;
for(iter = signatures.begin();iter != signatures.end();iter ++)
{
distance.insert(pair<float,int>(EMD(sourceSignature,*iter,CV_DIST_L2,number),number));
number ++;
}
//显示距离最小的前五名的检索图像
number = 0;
map<float,int>::iterator mapiter;
for(mapiter = distance.begin();mapiter != distance.end() && number <5;mapiter++,number++)
{
string simage = index.find((*mapiter).second)->second;
image = imread(simage,1);
namedWindow(simage,1);
imshow(simage,image);
}
waitKey(0);
return 0;
} Mat signature(const Mat & src)
{
Mat hsv,hist,normalHist;
//颜色空间转换
cvtColor(src,hsv,CV_BGR2HSV);
//一维直方图
int hbins = 90;
int histSize[] = {hbins};
float hranges[] = {0.0,180.0};
const float* ranges[] = {hranges}; int channels[] ={0};
calcHist(&hsv,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的第二列
for( int r=0;r < hbins; r++)
signature.at<float>(r,1) =float(r);
return signature;
}

检索数据库

检測图片:

我们选取y2作为检測图片:

结果:

图像检索:一维直方图+EMD距离的更多相关文章

  1. 图像检索:一维直方图+欧几里得距离+flann+KNN

    在F盘生成了一个文件名称为"文件夹"的文本文件. 第一步:批处理提取图像的一维颜色直方图,并保存到.xml中的featureHists 第一个參数:图像的路径 第二个參数:保存的. ...

  2. EMD距离

    一.场景介绍   最近在研究一个场景:图片质量评分,给一张图片一个预测的分数.   里面提到了用 EMD(Earth Mover’s Distance)算法来评估两张图片之间的分布距离.下面主要讲解下 ...

  3. 图像检索:RGBHistogram+欧几里得距离|卡方距离

    RGBHistogram: 分别计算把彩色图像的三个通道R.G.B的一维直方图,然后把这三个通道的颜色直方图结合起来,就是颜色的描写叙述子RGBHistogram. 以下给出计算RGBHistogra ...

  4. Earth Mover's Distance (EMD)

    原文: http://d.hatena.ne.jp/aidiary/20120804/1344058475作者: sylvan5翻译: Myautsai和他的朋友们(Google Translate. ...

  5. <转>从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/likika2012/article/details/39619687 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经 ...

  6. [转]Earth Mover's Distance (EMD)

    转自:http://www.sigvc.org/bbs/forum.php?mod=viewthread&tid=981 Earth Mover's Distance (EMD)原文: htt ...

  7. 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    转载自:http://blog.csdn.net/v_july_v/article/details/8203674/ 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说: ...

  8. 第十讲_图像检索 Image Retrieval

    第十讲_图像检索 Image Retrieval 刚要 主要是图像预处理和特征提取+相似度计算 相似颜色检索 算法结构 颜色特征提取:统计图片的颜色成分 颜色特征相似度计算 色差距离 发展:欧式距离- ...

  9. Android直方图递增View

    继上次分析实现Android自定义View之扇形图之后,自己又画了下面的这个递增直方图,本来是想做个静态的直方图就完了,结果想想静态的没啥趣味,于是就加了递增 1 从分析最终效果 界面上要展现的东西有 ...

随机推荐

  1. R与数据分析旧笔记(六)多元线性分析 下

    逐步回归 向前引入法:从一元回归开始,逐步加快变量,使指标值达到最优为止 向后剔除法:从全变量回归方程开始,逐步删去某个变量,使指标值达到最优为止 逐步筛选法:综合上述两种方法 多元线性回归的核心问题 ...

  2. 类 BufferedReader

    以前学习的时候也没有太在意,在项目中使用到了才发现呵呵 1.读取一个txt文件,方法很多种我使用了字符流来读取(为了方便) FileReader fr = new FileReader("f ...

  3. halcon与C#混合编程进阶版

    这篇主要是C#和Halcon的混合编程,在此基础上对按键不同功能的划分,以及图片适应窗口和从本地打开图片. 新手来这里:http://www.cnblogs.com/badguy518/p/55150 ...

  4. Qt限制文本框输入的方法(使用QRegExpValidator,为QLineEdit所独有)

    在做界面编程的时候,对文本框的处理往往是个很头疼的事情,一是焦点进入文本框时,从人性化考虑,应选择文本框中文本,方便输入:二是,限制文本框的输入,只允许输入有效的文本,如果不这样做的话,那么就需要在程 ...

  5. [js - 算法可视化] 汉诺塔(Hanoi)演示程序

    前段时间偶然看到有个日本人很早之前写了js的多种排序程序,使用js+html实现的排序动画,效果非常好. 受此启发,我决定写几个js的算法动画,第一个就用汉诺塔. 演示地址:http://tut.ap ...

  6. CCNA实验(3) -- RIP

    RIP协议分为版本1和版本2,均具备以下特征:1.是距离向量路由协议2.使用跳数(Hop Count)作为度量值3.默认路由更新周期为30秒4.管理距离(AD)为1205.支持触发更新6.最大跳数为1 ...

  7. BZOJ 4300 绝世好题(位运算)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4300 [题目大意] 给出一个序列a,求一个子序列b,使得&和不为0 [题解] ...

  8. POJ 3261 Milk Patterns(后缀数组+二分答案)

    [题目链接] http://poj.org/problem?id=3261 [题目大意] 求最长可允许重叠的出现次数不小于k的子串. [题解] 对原串做一遍后缀数组,二分子串长度x,将前缀相同长度超过 ...

  9. 打印NxN的矩阵

    找出规律,并打印出一个NxN的矩阵,规律就是从首坐标开始顺时针依次增大: #include<iostream> #include<vector> using namespace ...

  10. 用NDKr9编译最新ffmpeg2.0.1到android平台

    原文来自http://www.mingjianhua.com 本文参照 http://www.roman10.net/how-to-build-ffmpeg-with-ndk-r9/ 在linux下的 ...