图像检索:RGBHistogram+欧几里得距离|卡方距离
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+欧几里得距离|卡方距离的更多相关文章
- 数据分箱:等频分箱,等距分箱,卡方分箱,计算WOE、IV
转载:https://zhuanlan.zhihu.com/p/38440477 转载:https://blog.csdn.net/starzhou/article/details/78930490 ...
- t分布, 卡方x分布,F分布
T分布:温良宽厚 本文由“医学统计分析精粹”小编“Hiu”原创完成,文章采用知识共享Attribution-NonCommercial-NoDerivatives 4.0国际许可协议(http://c ...
- 卡方分布、卡方独立性检验和拟合性检验理论及其python实现
如果你在寻找卡方分布是什么?如何实现卡方检验?那么请看这篇博客,将以通俗易懂的语言,全面的阐述卡方.卡方检验及其python实现. 1. 卡方分布 1.1 简介 抽样分布有三大应用:T分布.卡方分布和 ...
- Spark MLlib编程API入门系列之特征选择之卡方特征选择(ChiSqSelector)
不多说,直接上干货! 特征选择里,常见的有:VectorSlicer(向量选择) RFormula(R模型公式) ChiSqSelector(卡方特征选择). ChiSqSelector用于使用卡方检 ...
- 特征选择--->卡方选择器
特征选择(Feature Selection)指的是在特征向量中选择出那些“优秀”的特征,组成新的.更“精简”的特征向量的过程.它在高维数据分析中十分常用,可以剔除掉“冗余”和“无关”的特征,提升学习 ...
- 互信息 & 卡方 - 文本挖掘
在做文本挖掘,特别是有监督的学习时,常常需要从文本中提取特征,提取出对学习有价值的分类,而不是把所有的词都用上,因此一些词对分类的作用不大,比如“的.是.在.了”等停用词.这里介绍两种常用的特征选择方 ...
- R-5 相关分析-卡方分析
本节内容: 1:相关分析 2:卡方分析 一.相关分析 相关系数: 皮尔逊相关系数:一般用来计算两个连续型变量的相关系数. 肯德尔相关系数:一个连续一个分类(最好是定序变量) 斯皮尔曼相关系数:2个变量 ...
- spark机器学习从0到1特征选择-卡方选择器(十五)
一.公式 卡方检验的基本公式,也就是χ2的计算公式,即观察值和理论值之间的偏差 卡方检验公式 其中:A 为观察值,E为理论值,k为观察值的个数,最后一个式子实际上就是具体计算的方法了 n 为总 ...
- 方差分析、T检验、卡方分析如何区分?
差异研究的目的在于比较两组数据或多组数据之间的差异,通常包括以下几类分析方法,分别是方差分析.T检验和卡方检验. 三个方法的区别 其实核心的区别在于:数据类型不一样.如果是定类和定类,此时应该使用卡方 ...
随机推荐
- Swift - 从字典(或者Alamofire)直接创建Model文件的工具
Swift - 从字典(或者Alamofire)直接创建Model文件的工具 效果 1. 常规生成model的方式 2. 通过debug创建model的方式 特性 1. 可以处理JSON格式的字典数据 ...
- 低版本系统兼容的ActionBar(三)自定义Item视图+进度条的实现+下拉导航+透明ActionBar
一.自定义MenuItem的视图 custom_view.xml (就是一个单选按钮) <?xml version="1.0" encoding="u ...
- information_schema系列七
information_schema系列七 这个系列的文章主要是为了能够让自己了解MySQL5.7的一些系统表,统一做一下备注和使用,也希望分享出来让大家能够有一点点的受益. 第七篇主要看一下一下 ...
- [转]mysqldump备份还原和mysqldump导入导出语句大全详解
FROM : http://www.cnblogs.com/zeroone/archive/2010/05/11/1732834.html mysqldump备份还原和mysqldump导入导出语句大 ...
- 解决Web部署 svg/woff/woff2字体 404错误 iis 解决Web部署 svg/woff/woff2字体 404错误
问题:最近在IIS上部署web项目的时候,发现浏览器总是报找不到woff.woff2字体的错误.导致浏览器加载字体报404错误,白白消耗了100-200毫秒的加载时间. 原因:因为服务器IIS不认SV ...
- 支付宝 iphone6 指纹验证失败
重启 iphone6 就可以了. 再次打开 支付宝 那个 指纹功能,就有一个弹出框 可以按指纹了.
- iOS: 获取UITableViewCell上添加的子控件对应的cell
一.简单介绍 UITableViewCell是UITableView的核心部分,我们在开发中因为功能的扩展经常需要自定义,以便在其上面添加子控件,例如button.label等.添加后获取这些子控件的 ...
- JUnit 入门
JUNIT了解学习 转自:关于Java单元测试,你需要知道的一切 转自:JUnit 入门教程 JUnit高级用法之@RunWith @RunWith 关于@RunWith注解,官方文档是这么描述的: ...
- Home Assistant 安装Samba和SSH server 插件
安装 Samba 插件 Samba 是 SMB/CIFS 网络协议的重新实现, 它作为 NFS 的补充使得在 Linux 和 Windows 系统中进行文件共享.打印机共享更容易实现. Smaba 服 ...
- HTML5读取本地文件
本文转自:转:http://hushicai.com/2014/03/29/html5-du-qu-ben-di-wen-jian.html感谢大神分享. 常见的语言比如php.shell等,是如何读 ...