图像检索: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 - UITableView展开缩放动画
Swift - UITableView展开缩放动画 效果 源码 https://github.com/YouXianMing/Swift-Animations // // HeaderViewTapA ...
- Java-----隐藏手机号中间四位,身份证号码中间几位
phone.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");152****4799 idCard.replace ...
- 成功让Eclipse更新ADT的方法
[本文转载自]http://blog.csdn.net/yihui8/article/details/8044426 原文:配置android开发环境eclipse获取ADT获取不到 https:// ...
- EditText添加表情
package com.kale.edittext02; import java.lang.reflect.Field; import java.util.Random; import android ...
- [Web 前端] mockjs让前端开发独立于后端
cp from : https://www.codercto.com/a/9839.html mock.js 可以模拟ajax数据,拦截ajax请求,返回模拟数据,无需后端返回就可以测试前端程序 ...
- 访问修饰符(C# 编程指南)
所有类型和类型成员都具有可访问性级别,该级别可以控制是否可以从你的程序集或其他程序集中的其他代码中使用它们. 可以使用以下访问修饰符在进行声明时指定类型或成员的可访问性: public同一程序集中的任 ...
- Java工程Properties配置文件注释中文,会自动转换为其他编码方式问题解决 中文乱码
properties文件中想注释中文,但是写出来后却是 :# /4djf/234/4354/r23df/324d 这种效果 是因为字符编码默认没有设置造成的,以前总是安装插件解决此问题, 但是却牺牲 ...
- JVM的内存区域划分(转)
原文链接:JVM的内存区域划分 JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内 ...
- Backbone.js 使用模板
实际的应用中会使用到模板,Model 等,而模板又是进阶的基础.所以这里介绍在 View 中使用模板,以及如何向模板填充值,模板可以用字符串,或是用 <script type="tex ...
- JS的scrollIntoView简单使用
scrollIntoView方法滚动当前元素,进入浏览器的可见区域 el.scrollIntoView(); // 等同于el.scrollIntoView(true) el.scrollIntoVi ...