RGBHistogram:

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

以下给出计算RGBHistogram的代码:

<span style="font-family:Microsoft YaHei;font-size:18px;">#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h> using namespace std;
using namespace cv; const int HISTSIZE = 8;
int main( int, char** argv )
{
Mat src, dst; /// Load image
src = imread( argv[1], 1 ); if( !src.data || (src.channels() !=3))
{ return -1; } Mat rgbFeature = bgrHistogram(src); return 0;
} Mat bgrHistogram(const Mat& src)
{
//分离B、G、R通道
vector<Mat> bgr_planes;
split(src,bgr_planes); float range[] = { 0, 256 } ;
const float* histRange = { range }; bool uniform = true; bool accumulate = false; Mat hist1d,normHist1d,hist; for(int i = 0 ;i < 3;i++)
{
calcHist( &bgr_planes[i], 1, 0, Mat(), hist1d, 1, &HISTSIZE, &histRange, uniform, accumulate );
normalize(hist1d,hist1d,1.0,0.0,CV_L1);
hist.push_back(hist1d);
}
return hist;
}
</span>

第二步:颜色描写叙述子已经计算出,选取什么样的距离。

对于距离我们先选取两种:

第一种:欧几里得距离

#include<iostream>
#include <fstream>
#include <stdio.h>
using namespace std; #include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv; const int HISTSIZE = 16;
Mat bgrHistogram(const Mat& src);
double euclideanDistance(const Mat & src1,const Mat &src2);
int main( int, char** argv )
{
//定义文件流,仅仅能读取
ifstream inPutFile(argv[1],ios::in);
if(! inPutFile)
{
cerr << "File Open Erro !"<<endl;
return -1;
} //读取文件流中的每一行。并赋值给fileName,形成查询数据库
string fileName ;
Mat image,histogram,sourceHisrogram;
vector<Mat> histograms; map<int,string>index;//图像的索引
index.clear();
int number = 0;
histograms.clear();
while(getline(inPutFile,fileName))
{
index.insert(pair<int,string>(number,fileName));
number++;
image = imread(fileName,1);
histogram = bgrHistogram(image);
histograms.push_back(histogram);
}
//待搜索的图像
number = 0;
Mat imageSource = imread(argv[2],1);
sourceHisrogram = bgrHistogram(imageSource);
vector<Mat>::iterator iter;
map<double,int>distance;
for(iter = histograms.begin();iter != histograms.end();iter++)
{
distance.insert(pair<double,int>(euclideanDistance(sourceHisrogram,*iter),number));
number++;
}
//显示距离最小的前五名的检索图像
number = 0;
map<double,int>::iterator mapiter;
for(mapiter = distance.begin();mapiter != distance.end() && number <2;mapiter++,number++)
{
string simage = index.find((*mapiter).second) ->second;
image = imread(simage,1);
namedWindow(simage,1);
imshow(simage,image);
}
waitKey(0);
} Mat bgrHistogram(const Mat& src)
{
//分离B、G、R通道
vector<Mat> bgr_planes;
split(src,bgr_planes); float range[] = { 0, 256 } ;
const float* histRange = { range }; bool uniform = true; bool accumulate = false; Mat hist1d,normHist1d,hist; for(int i = 0 ;i < 3;i++)
{
calcHist( &bgr_planes[i], 1, 0, Mat(), hist1d, 1, &HISTSIZE, &histRange, uniform, accumulate );
normalize(hist1d,hist1d,1.0,0.0,CV_L1);
hist.push_back(hist1d);
}
return hist;
} double euclideanDistance(const Mat & src1,const Mat &src2)
{
Mat pow2;
pow(src1-src2,2.0,pow2);
return sqrt(sum(pow2)[0]);
}

搜索数据库

执行结果:

另外一种:卡方距离

#include<iostream>
#include <fstream>
#include <stdio.h>
using namespace std; #include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv; const int HISTSIZE = 16;
Mat bgrHistogram(const Mat& src);
int main( int, char** argv )
{
//定义文件流,仅仅能读取
ifstream inPutFile(argv[1],ios::in);
if(! inPutFile)
{
cerr << "File Open Erro !"<<endl;
return -1;
} //读取文件流中的每一行。并赋值给fileName,形成查询数据库
string fileName ;
Mat image,histogram,sourceHisrogram;
vector<Mat> histograms; map<int,string>index;//图像的索引
index.clear();
int number = 0;
histograms.clear();
while(getline(inPutFile,fileName))
{
index.insert(pair<int,string>(number,fileName));
number++;
image = imread(fileName,1);
histogram = bgrHistogram(image);
histograms.push_back(histogram);
}
//待搜索的图像
number = 0;
Mat imageSource = imread(argv[2],1);
sourceHisrogram = bgrHistogram(imageSource);
vector<Mat>::iterator iter;
map<double,int>distance;
for(iter = histograms.begin();iter != histograms.end();iter++)
{
distance.insert(pair<double,int>(compareHist(sourceHisrogram,*iter,CV_COMP_CHISQR),number));
number++;
}
//显示距离最小的前五名的检索图像
number = 0;
map<double,int>::iterator mapiter;
for(mapiter = distance.begin();mapiter != distance.end() && number <2;mapiter++,number++)
{
string simage = index.find((*mapiter).second) ->second;
image = imread(simage,1);
namedWindow(simage,1);
imshow(simage,image);
}
waitKey(0);
} Mat bgrHistogram(const Mat& src)
{
//分离B、G、R通道
vector<Mat> bgr_planes;
split(src,bgr_planes); float range[] = { 0, 256 } ;
const float* histRange = { range }; bool uniform = true; bool accumulate = false; Mat hist1d,normHist1d,hist; for(int i = 0 ;i < 3;i++)
{
calcHist( &bgr_planes[i], 1, 0, Mat(), hist1d, 1, &HISTSIZE, &histRange, uniform, accumulate );
normalize(hist1d,hist1d,1.0,0.0,CV_L1);
hist.push_back(hist1d);
}
return hist;
}

搜索图片数据库

执行结果:(我仅仅提取前两副距离近期的图片)

图像检索:RGBHistogram+欧几里得距离|卡方距离的更多相关文章

  1. 数据分箱:等频分箱,等距分箱,卡方分箱,计算WOE、IV

    转载:https://zhuanlan.zhihu.com/p/38440477 转载:https://blog.csdn.net/starzhou/article/details/78930490 ...

  2. t分布, 卡方x分布,F分布

    T分布:温良宽厚 本文由“医学统计分析精粹”小编“Hiu”原创完成,文章采用知识共享Attribution-NonCommercial-NoDerivatives 4.0国际许可协议(http://c ...

  3. 卡方分布、卡方独立性检验和拟合性检验理论及其python实现

    如果你在寻找卡方分布是什么?如何实现卡方检验?那么请看这篇博客,将以通俗易懂的语言,全面的阐述卡方.卡方检验及其python实现. 1. 卡方分布 1.1 简介 抽样分布有三大应用:T分布.卡方分布和 ...

  4. Spark MLlib编程API入门系列之特征选择之卡方特征选择(ChiSqSelector)

    不多说,直接上干货! 特征选择里,常见的有:VectorSlicer(向量选择) RFormula(R模型公式) ChiSqSelector(卡方特征选择). ChiSqSelector用于使用卡方检 ...

  5. 特征选择--->卡方选择器

    特征选择(Feature Selection)指的是在特征向量中选择出那些“优秀”的特征,组成新的.更“精简”的特征向量的过程.它在高维数据分析中十分常用,可以剔除掉“冗余”和“无关”的特征,提升学习 ...

  6. 互信息 & 卡方 - 文本挖掘

    在做文本挖掘,特别是有监督的学习时,常常需要从文本中提取特征,提取出对学习有价值的分类,而不是把所有的词都用上,因此一些词对分类的作用不大,比如“的.是.在.了”等停用词.这里介绍两种常用的特征选择方 ...

  7. R-5 相关分析-卡方分析

    本节内容: 1:相关分析 2:卡方分析 一.相关分析 相关系数: 皮尔逊相关系数:一般用来计算两个连续型变量的相关系数. 肯德尔相关系数:一个连续一个分类(最好是定序变量) 斯皮尔曼相关系数:2个变量 ...

  8. spark机器学习从0到1特征选择-卡方选择器(十五)

      一.公式 卡方检验的基本公式,也就是χ2的计算公式,即观察值和理论值之间的偏差   卡方检验公式 其中:A 为观察值,E为理论值,k为观察值的个数,最后一个式子实际上就是具体计算的方法了 n 为总 ...

  9. 方差分析、T检验、卡方分析如何区分?

    差异研究的目的在于比较两组数据或多组数据之间的差异,通常包括以下几类分析方法,分别是方差分析.T检验和卡方检验. 三个方法的区别 其实核心的区别在于:数据类型不一样.如果是定类和定类,此时应该使用卡方 ...

随机推荐

  1. SharePoint Online 设置网站集

    前言 本文介绍如何在Office 365中设置SharePoint Online网站集,当我们创建好SharePoint Online站点,开始使用之前,一定会有一些基本的设置,本文就为大家介绍这些基 ...

  2. WinForm 自动完成控件实例代码简析

    在Web的应用方面有js的插件实现自动完成(或叫智能提示)功能,但在WinForm窗体应用方面就没那么好了. TextBox控件本身是提供了一个自动提示功能,只要用上这三个属性: AutoComple ...

  3. Calendar获取当天的初始时间,当月的初始时间,当年的初始时间

    如下:

  4. C++虚函数之接口 最简单的功能

    虚函数 ,接口,到底有什么用呢? 以前我都是在C++ 里面写C,只用到 简单的C++面对对象知识 #include<stdio.h> class IServerLogic{ virtual ...

  5. 聊一聊Spring中的线程安全性

    Spring作为一个IOC/DI容器,帮助我们管理了许许多多的“bean”.但其实,Spring并没有保证这些对象的线程安全,需要由开发者自己编写解决线程安全问题的代码. Spring对每个bean提 ...

  6. 析构函数 (C++)

    最近发现自己对析构函数的认知有一定的问题,因为之前有在使用placement new时主动调用对象的析构函数,所以觉得析构函数只是个普通的成员函数,调用的时候只会执行自己方法体内的代码内容,而回收内存 ...

  7. 自定义View 可清除内容、设置图标、下划线的输入框 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  8. SpringBoot学习:整合shiro(身份认证和权限认证),使用EhCache缓存

    项目下载地址:http://download.csdn.NET/detail/aqsunkai/9805821 (一)在pom.xml中添加依赖: <properties> <shi ...

  9. 揭破android中的闹钟app 二

    · 这节,我们通过wheelview来模仿一个简易的正点闹钟. 我这里不说wheelview来龙去脉,只阐述几个简单的方法,如果,想看一看具体wheelview的内容,请看下面两篇文章: androi ...

  10. jdbc操作数据库并自动获取字段类型

    //获取改功能编码的关联功能 public void getLinkdb(String gnbianma){ PreparedStatement pstmt = null; ResultSet rs ...