图像检索:RGBHistogram+欧几里得距离|卡方距离
来源:互联网 发布:如何快速网络招商 编辑:程序博客网 时间:2024/05/17 03:08
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;}搜索图片数据库
运行结果:(我只提取前两副距离最近的图片)
2 0
- 图像检索:RGBHistogram+欧几里得距离|卡方距离
- 图像检索:CIE Lab三维直方图+卡方距离
- 图像检索:一维直方图+欧几里得距离+flann+KNN
- 图像检索:二维直方图+flann+KNN+欧几里得距离
- 图像检索:二维直方图+flann+KNN+欧几里得距离
- 卡方距离
- 图像检索:一维直方图+EMD距离
- 图像检索:二维直方图+EMD距离
- 欧几里得距离和曼哈顿距离
- 欧几里得距离 曼哈坦距离 明考斯基距离
- 欧几里得空间与距离
- 基于汉明距离的LSH图像检索算法
- 图像检索:EMD距离(Earth Mover's Distance)及纠错
- 图像检索中相似度度量公式:各种距离
- 图像检索中相似度度量公式:各种距离
- 曼哈顿距离 欧几里得距离 切比雪夫距离
- 欧几里得距离、曼哈顿距离和切比雪夫距离
- 欧几里得距离,曼哈顿距离,切比雪夫距离
- 信用卡3D验证相关资料
- 添加ftp用户及对应目录
- hdu 2112 HDU Today
- 简单空间配置器
- shell学习笔记1——基础篇
- 图像检索:RGBHistogram+欧几里得距离|卡方距离
- ASP.NET Web API之消息[拦截]处理
- 如何在Quartus II中设置Virtual pin
- 取消vs2013在solution中单击打开文件的功能
- android里,addContentView()动态增加view控件,并实现控件的顶部,中间,底部布局
- Piggy-Bank hdoj 1114
- 写代码的被美女老板看上——室内地图GIS
- 基于注解配置简单的SpringMVC+Mybatis
- 为VS2005添加cl.exe的环境变量