利用一维颜色直方图做图像检索

在F盘生成了一个文件名为“目录”的文本文件。

第一步:批处理提取图像的一维颜色直方图

#include<iostream>
#include<fstream>
#include<string>
using namespace std;

#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace cv;

//计算一维直方图特征
Mat hist1d(const Mat& src);

int main(int argc,char* argv[])
{
    if(argc !=3)
    {
        cerr << "Wrong Argument !" <<endl;
        return -1;
    }
    //定义文件流,只能读取
    ifstream inPutFile(argv[1],ios::in);
    if(! inPutFile)
    {
        cerr << "File Open Erro !" <<endl;
        return -1;
    }
    //读取文件流中的每一行,并赋值给fileName,读取每一幅图像并显示
    string fileName ;
    Mat image;
    Mat featureHist;
    Mat featureHists;
    while (getline(inPutFile,fileName))
    {
        
        image = imread(fileName,1);
        //计算一维直方图特征
        featureHist = hist1d(image);
        //按行存储每一幅图像的一维直方图特征
        featureHists.push_back(featureHist);
    }
    //注意一定要记得关闭文件流
    inPutFile.close();

    /*第五步,把图像特征保存到.xml文件中*/
    FileStorage fs(argv[2],FileStorage::WRITE);
    fs<<"featureHists"<<featureHists;
    fs.release();
    
    return 0;
}

Mat hist1d(const Mat& src)
{
    Mat hsv;

    //颜色空间的转换 BGR2HSV
    cvtColor(src,hsv,CV_BGR2HSV);

    //把H通道分为60个bin
    int hbins = 60;
    int histSize[] = { hbins };

    //H的取值范围 0-179
    float hranges[]= {0,180};
    const float* ranges [] ={hranges};

    Mat hist1D,histRow,histRowDst;
    //我们根据图像的第一通道,计算一维直方图,而且输出的hist1D为32F
    int channels [] ={0};
    calcHist(&hsv,1,channels,Mat(),hist1D,1,histSize,ranges,true,false);
    //把直方图特征按一行来存储
    histRow=hist1D.reshape(1,1);

    //把直方图归一化
    normalize(histRow,histRowDst,1,0,NORM_L1);

    return histRowDst;
}

编译完成后,进入命令行

然后,在F盘出现了一个features的.xml文件,里边存储了上述图像一维直方图特征。

—————————————————————————————————————————————————————————————————————————————

第二步:提取色卡的一维颜色直方图

#include<iostream>
#include<string>
using namespace std;

#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;

int main(int argc,char* argv[])
{
	Mat src = imread(argv[1],1);
	if(! src.data)
	{
		cout <<"No Image" << endl;
		return -1;
	}

	Mat hsv;
	//颜色空间的转换BGR2HSV
	cvtColor(src,hsv,CV_BGR2HSV);

	//把H通道分为60个bin
	int hbins = 60;
	int histSize[] = { hbins };

	//H的取值范围 0-179
	float hranges[]= {0,180};

	const float* ranges [] ={hranges};
	Mat hist1D,histRow,histRowDst;
	//我们根据图像的第一通道,计算一维直方图,而且输出的hist1D为32F
	int channels [] ={0};
	calcHist(&hsv,1,channels,Mat(),hist1D,1,histSize,ranges,true,false);
	//把直方图特征按一行来存储
	histRow=hist1D.reshape(1,1);

	//把直方图归一化
	normalize(histRow,histRowDst,1,0,NORM_L1);
	FileStorage fs(argv[2],FileStorage::WRITE);
	//把histRowDst保存到.xml文件中
	fs << argv[3] << histRowDst;
	fs.release();
	return 0;
}

分别各自提取他们的一维颜色直方图

然后,在F盘出现了四个.xml文件,分别存放了他们的颜色直方图信息

____________________________________________________________________________________________________________________________________

第三步:利用颜色卡的颜色直方图检索图像的颜色直方图

利用一维颜色直方图做图像检索

时间: 2024-08-06 09:09:15

利用一维颜色直方图做图像检索的相关文章

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

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

c语言一维数组做参数传递给函数:

今天碰到了一维数组做函数参数的问题,那就扒一扒这个问题: 首先抛结论: 1:C语言中,当一维数组做函数参数时,编译器总是把它解析成一个指向其首元素的指针. 2:实际传递的数组大小与函数形参指定的数组大小没有关系. 然后举例说明: 下面是一个元素交换函数,把数组array[i]和array[j]交换位置.注意看数组是怎么传递给函数的. 正确的写法1: 解释说明:编译器把array解析成指向整形元素的指针,也就是数组的首地址,方括号中加不加指定数字都可以,因为编译器根本不看,因此最好不写,以免引起误

RedHat 6.4企业版利用iso镜像做本地yum源

修改文章:http://linux.cn/article-1017-1.html 而RedHat的yum则需要注册付费才能使用,如果不这样则有两种解决方案 1. 利用iso镜像做本地yum源 2. 利用光盘做本地yum源 在这里用iso或者光盘做本地yum源的方法是差不多的,只是用光盘的话Linux系统会自动挂载,用iso镜像的或需要手动挂载,这里就说挂载iso的方法吧. [一]用本地文件创建本地yum源 1. 创建iso存放目录和挂载目录 mkdir /mnt/iso mkdir /mnt/c

Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)

概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效果,可以说还是非常的理想的.同时我们也收集到了不少的问题,比如说如何在这种分布式的架构下使用Session,NLB中有一台服务器挂掉了会导致对外暴露的地址无法访问,如果实现服务器之间的同步,如果更好的进行热修复等等,还有我们在上一篇中也提到了NLB所提供的功能是非常简单的,为了回答我们前面提到的问题

利用KBEngine +U3D 做的一个简单MMO手游Demo

利用KBE +U3D 做的一个简单MMO手游Demo目前只完成到一个普通攻击和一个火球术,  火球术需要点击怪物后才能释放.点击npc后会跳到一个副本.里面有一只半兽人. 欢迎大家来试玩 并提出宝贵意见.http://pan.baidu.com/s/1dDtVjnb 感谢kbe 一直以来的帮助.

nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录

geo指令使用ngx_http_geo_module模块提供的.默认情况下,nginx有加载这个模块,除非人为的 --without-http_geo_module.ngx_http_geo_module模块可以用来创建变量,其值依赖于客户端IP地址.geo指令语法: geo [$address] $variable { ... }默认值: -配置段: http定义从指定的变量获取客户端的IP地址.默认情况下,nginx从$remote_addr变量取得客户端IP地址,但也可以从其他变量获得.例

亚马逊AWS林家伟:怎么利用云来做颠覆性的事

<--------- LEFT--<) 导语:6月7日,创新中国成都赛区在成都世纪城娇子国际会议中心举行.亚马逊AWS跨国企业及市场营销拓展部主管林家伟介绍怎么利用云来做颠覆性的事. 亚马逊AWS跨国企业及市场营销拓展部主管 林家伟 6月7日,以发现国内锐公司.扶持有梦想的创业者,并为其提供展示平台的"创新中国"成都赛区在成都世纪城娇子国际会议中心举行.大赛由创业邦联合创业场.天府软件园共同举办.亚马逊AWS跨国企业及市场营销拓展部主管林家伟介绍怎么利用云来做颠覆性的事情.

一年多利用业余时间做的协作软件截图

最近完成的协作工具,包括Android App,Window通知助手,响应式UI,协作Web Application(权限系统可控制到页面元素.路由.Web Api:消息通知:包含工作流设计器的工作流引擎:个人及共享日历:支持多语言)等. 一年多利用业余时间做的协作软件截图

利用一维FFT查看正弦波频谱信息

利用一维FFT查看正弦波频谱信息,所需的SIMULINK模型如下图1所示.Zero-Order Hold用于采样正弦波,设置方式如图2所示.BUffer用于缓存采样数据,深度可以设置,深度等于FFT的长度,设置方式如图3所示.FFT的点数跟BUFFER的深度相同,比如,buffer深度为1024,那么此处的FFT就采用1024点的FFT.最后FFT的计算结果可以通过Vector Scope来查看,设置方式如图4和5所示. 图1,SIMULINK模型 图2,ZERO-ORDER HOLD设置 图3