直方图 陆地移动距离 cvCalcEMD2 基于HSV的HS

程序:

HSize=30,SSize=32:比例为2.89

HSize=20,SSize=20:比例为2.88

HSize=50,SSize=50:比例为2.87

代码:

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <iostream>
CvHistogram* histogram(IplImage* src,int HSize,int SSize) //返回归一化的histogram
{
IplImage* SrcH=cvCreateImage(cvGetSize(src),8,1);
IplImage* SrcS=cvCreateImage(cvGetSize(src),8,1);
//分割HSV
cvSplit(src,SrcH,SrcS,NULL,NULL);
//创建histogram
CvHistogram* hist;
int dims=2;
int size[]={HSize,SSize};
float RangeH[]={0,180};
float RangeS[]={0,360};
float* ranges[]={RangeH,RangeS};
hist=cvCreateHist(dims,size,CV_HIST_ARRAY,ranges);
//计算histogram
IplImage* image[]={SrcH,SrcS};
cvCalcHist(image,hist);
//归一化histogram
cvNormalizeHist(hist,1.0);  //所有值加起来为1
return hist;
}
CvMat* CreateSignature(CvHistogram* hist,int HSize,int SSize)  //由histogram得到signature
{
int rows=HSize*SSize;
CvMat* mat=cvCreateMat(rows,3,CV_32FC1); //第一列为结果,第二列为histogram中该结果的行号,第三列为列号
for(int rows=0;rows<HSize;rows++)
{
for(int cols=0;cols<SSize;cols++)
{
float data=cvQueryHistValue_2D(hist,rows,cols);
cvSet2D(mat,rows*SSize+cols,0,cvScalar(data));
cvSet2D(mat,rows*SSize+cols,1,cvScalar(rows));
cvSet2D(mat,rows*SSize+cols,2,cvScalar(cols));
}
}
return mat;
}
int CalcEMD2(int argc,char** argv)  //EMD:earth mover‘s distance 陆基移动距离
{
IplImage* src1=cvLoadImage("e:\\picture\\4.jpg");
IplImage* src2=cvLoadImage("e:\\picture\\11.jpg");
int HSize=30;
int SSize=32;
CvHistogram* hist1=histogram(src1,HSize,SSize);
CvHistogram* hist2=histogram(src2,HSize,SSize);
CvMat* mat1=CreateSignature(hist1,HSize,SSize);
CvMat* mat2=CreateSignature(hist2,HSize,SSize);
//计算陆基移动距离
float EMD2Result=cvCalcEMD2(mat1,mat2,CV_DIST_L2);
std::cout<<"0 is best"<<std::endl;
std::cout<<"EMD2Result:"<<EMD2Result<<std::endl;
cvNamedWindow("src1");
cvNamedWindow("src2");
cvShowImage("src1",src1);
cvShowImage("src2",src2);
cvWaitKey(0);
cvDestroyWindow("src1");
cvDestroyWindow("src2");
cvReleaseImage(&src1);
cvReleaseImage(&src2);
return 0;
}

直方图 陆地移动距离 cvCalcEMD2 基于HSV的HS

时间: 2024-08-29 23:14:15

直方图 陆地移动距离 cvCalcEMD2 基于HSV的HS的相关文章

直方图 陆基移动距离 cvCalcEMD2 基于BGR

和基于HSV的陆基移动距离相对比,这个为三维直方图 程序: 结论: 和基于HSV的路基距离相比,效果没有HSV好 代码: #include "cv.h" #include "cxcore.h" #include "highgui.h" #include <iostream> CvHistogram* histogram(IplImage* src,int BSize,int GSize,int RSize) //返回归一化的histo

【练习7.4】使用直方图陆地移动距离EMD区分不同光线条件下的图片cvCalcEMD2

提纲 题目要求 程序代码 结果图片 要言妙道 题目要求: 设计一个直方图,可以判断给定的图像是在哪种光线条件下被捕捉到的. 程序代码: 1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点. 2 // 3 //D:\\Work\\Work_Programming\\Source\\Image\\lena.jpg 4 5 #include "stdafx.h" 6 #include <cv.h> 7 #include <highg

基于HSV分块颜色直方图的图像检索算法

引 言 随着多媒体技术及[nternet技术的迅速发展,各行各业对图像的使用越来越广泛,图像信息资源的管理和检索显得越来越重要.传统的通过手工标记和索引图像(即基于文本的图像检索)的方法已经不能满足人们的需求,随之而来的问题是:随着图像数据的剧增和人们对图像的理解具有不同的侧重点,不同的人从不同的角度对同一幅图像的认识可能存在很大的差异性,因此无法准确反映图像信息.基于内容的图像检索方法(Content-Based Image Retrieval,CBIR)由此应运而生. 在基于内容的图像检索中

图像检索:二维直方图+EMD距离

#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

[UWP]分享一个基于HSV色轮的调色板应用

原文:[UWP]分享一个基于HSV色轮的调色板应用 1. 前言 上一篇文章介绍了HSV色轮,这次分享一个基于HSV色轮的调色板应用,应用地址:ColorfulBox - Microsoft Store 2. 功能 ColorfulBox是Adobe 色轮的简单模仿,只实现了最基本的功能,UI也没那么好看,也没用MVVM框架. 2.1 HSV色轮 这个应用最好玩的地方在于分布于HSV色轮上的各个点(ColorPoint)以及可以通过拖动它们改变颜色.ColorPoint的基本结构如下(不是完整代码

图像检索:一维直方图+EMD距离

EMD距离详细介绍已经在在这里已经给出. 思路:我们把一张图像的归一化的一维直方图作为signature的权重值,把色相的值作为signature.也就是一般在比较两幅图像的EMD距离时,signature是一样,只是权重值不一样. 通过以下程序,就可以得到一幅图像的signature: #include<iostream> using namespace std; #include<opencv2\core\core.hpp> #include<opencv2\highgu

(转)颜色直方图, HSV直方图, histogram bins

原文链接:https://www.xuebuyuan.com/3256564.html 一个histogram,通常可以用一个列向量表示(例子中的a,b),列向量里面的每一个值就是一个bin(a,b),比如说列向量有个50个元素,那么就代表有50个bin.对于彩色图像,一般是rgb,3个维度,每个颜色一般是0-255的灰度级,就是对应8个bin,每个维度8bin, 直方图是频次的累计,实际上是一种简单的概率分布,你要求的是,RGB分别为(1,1,1),(1,1,2),(1,1,3),...,(8

利用OpenCV的calcHist绘制灰度直方图、H-S直方图、BGR直方图和自定义直方图的源码及说明

要绘制直方图,最重要的三个函数是calcHist.line.和rectangle,下面分别进行介绍! calcHist函数: calcHist函数的原型如下: void calcHist( const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform=t

【练习7.3】从直方图创建signature、计算两个直方图的EMD距离

提纲 题目要求 程序代码 结果图片 要言妙道 题目要求: 收集三种光照条件下的手的直方图,计算它们之间的EMD距离 程序代码: 1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点. 2 // 3 //D:\\Work\\Work_Programming\\Source\\Image\\lena.jpg 4 5 #include "stdafx.h" 6 #include <cv.h> 7 #include <highgui.h