码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-07-08 14:30:07      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:计算机视觉   一维颜色直方图   opencv   图像检索   

bubuko.com,布布扣

bubuko.com,布布扣

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

bubuko.com,布布扣

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

#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;
}

编译完成后,进入命令行

bubuko.com,布布扣

然后,在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;
}

bubuko.com,布布扣

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

bubuko.com,布布扣


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

____________________________________________________________________________________________________________________________________

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


利用一维颜色直方图做图像检索,布布扣,bubuko.com

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

标签:计算机视觉   一维颜色直方图   opencv   图像检索   

原文地址:http://blog.csdn.net/zhangping1987/article/details/37502383

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!