`
luoweifu
  • 浏览: 62569 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

基于直方图特征的图像搜索

 
阅读更多

概述

图像搜索现实的一般过程:

提取图像特征值→对特征值进行处理→匹配特征值

图像的特征值有很多,基于颜色特征,纹理特征,形状特征等,下面是基于图像颜色直方图特征的图像搜索。

(参考文章:http://blog.csdn.net/jia20003/article/details/7771651#comments)

原理

巴氏系数(Bhattacharyyacoefficient)算法


其中P, P’分别代表源与候选的图像直方图数据,对每个相同i的数据点乘积开平方以后相加

得出的结果即为图像相似度值(巴氏系数因子值),范围为01之间。为什么是到1之间,这是数学的问题,就不追究了。

步骤

一、求源图像和要被搜索图像的直方图特征

二、根据直方图特征,用巴氏系数算法求出源图像和要搜索图像的相似度

彩色图像的每个像素由red,green,blue三种组成,如何好地表示彩色图像的直方图更呢?一般有两种方式:

一种是用三维的直方图表示,这种方式简单明了,如hist[][]hist[0][]表示red的直方图,hist[1][]表示green的直方图,hist[2][]表示blue的直方图;如一个像素为(156,72,89),hist[0][156]++; hist[0][72]++, hist[0][89]++;

另一种方式是降低灰度的级数,用一维直方图表示,如将256级的灰度降至16级,可用12位的int表示灰度值,前4位表示red,中间4们表示green,后面4位表示blue;一个像素为(156,72,89), r=156/16=9; g=72/16=4,b=89/16=5; index = r<<(2*4) | g<<4 | b; hist[index] ++;

源码


三维直方图表示

/**
	 * 求三维的灰度直方图
	 * @param srcPath
	 * @return
	 */
	public static double[][] getHistgram(String srcPath) {
		BufferedImage img = ImageDigital.readImg(srcPath);
		return getHistogram(img);
	}
	/**
	 * hist[0][]red的直方图,hist[1][]green的直方图,hist[2][]blue的直方图
	 * @param img 要获取直方图的图像
	 * @return 返回r,g,b的三维直方图
	 */
	public static double[][] getHistogram(BufferedImage img) {
		int w = img.getWidth();
		int h = img.getHeight();
		double[][] hist = new double[3][256]; 
		int r, g, b;
		int pix[] = new int[w*h]; 
		pix = img.getRGB(0, 0, w, h, pix, 0, w);
		for(int i=0; i<w*h; i++) {
			r = pix[i]>>16 & 0xff;
			g = pix[i]>>8 & 0xff;
			b = pix[i] & 0xff;
			/*hr[r] ++;
			hg[g] ++;
			hb[b] ++;*/
			hist[0][r] ++;
			hist[1][g] ++;
			hist[2][b] ++;
		}
		for(int j=0; j<256; j++) {
			for(int i=0; i<3; i++) {
				hist[i][j] = hist[i][j]/(w*h);
				//System.out.println(hist[i][j] + "  ");
			}
		}
		return hist;
	}
	public double indentification(String srcPath, String destPath) {
		BufferedImage srcImg = ImageDigital.readImg(srcPath);
		BufferedImage destImg = ImageDigital.readImg(destPath);
		return indentification(srcImg, destImg);
	}
	
	public double indentification(BufferedImage srcImg, BufferedImage destImg) {
		double[][] histR = getHistogram(srcImg);
		double[][] histD = getHistogram(destImg);
		return indentification(histR, histD);
	}
	
	public static double indentification(double[][] histR, double[][] histD) {
		double p = (double) 0.0;
		for(int i=0; i<histR.length; i++) {
			for(int j=0; j<histR[0].length; j++) {
				p += Math.sqrt(histR[i][j]*histD[i][j]);
			}
		}
		return p/3;
	}
/**
	 * 用三维灰度直方图求图像的相似度
	 * @param n
	 * @param str1
	 * @param str2
	 */
	public static void histogramIditification(int n, String str1, String str2) {
		double p = 0;
		double[][] histR = GreyIdentification.getHistgram(str1); 
		double[][] histD = null;
		for(int i=0; i<n; i++) {
			histD = GreyIdentification.getHistgram(str2 + (i+1) + ".jpg");
			p = GreyIdentification.indentification(histR, histD);
			System.out.print((i+1) + "--" + p + "    ");
		}
	}

一维直方图表示

/**
	 * 求一维的灰度直方图
	 * @param srcPath
	 * @return
	 */
	public static double[] getHistgram2(String srcPath) {
		BufferedImage img = ImageDigital.readImg(srcPath);
		return getHistogram2(img);
	}
	/**
	 * 求一维的灰度直方图
	 * @param img
	 * @return
	 */
	public static double[] getHistogram2(BufferedImage img) {
		int w = img.getWidth();
		int h = img.getHeight();
		int series = (int) Math.pow(2, GRAYBIT);	//GRAYBIT=4;用12位的int表示灰度值,前4位表示red,中间4们表示green,后面4位表示blue
		int greyScope = 256/series;
		double[] hist = new double[series*series*series]; 
		int r, g, b, index;
		int pix[] = new int[w*h]; 
		pix = img.getRGB(0, 0, w, h, pix, 0, w);
		for(int i=0; i<w*h; i++) {
			r = pix[i]>>16 & 0xff;
			r = r/greyScope;
			g = pix[i]>>8 & 0xff;
			g = g/greyScope;
			b = pix[i] & 0xff;
			b = b/greyScope;
			index = r<<(2*GRAYBIT) | g<<GRAYBIT | b; 
			hist[index] ++;
		}
		for(int i=0; i<hist.length; i++) {
			hist[i] = hist[i]/(w*h);
			//System.out.println(hist[i] + "  ");
		}
		return hist;
	}
	public double indentification2(String srcPath, String destPath) {
		BufferedImage srcImg = ImageDigital.readImg(srcPath);
		BufferedImage destImg = ImageDigital.readImg(destPath);
		return indentification2(srcImg, destImg);
	}
	
	public double indentification2(BufferedImage srcImg, BufferedImage destImg) {
		double[] histR = getHistogram2(srcImg);
		double[] histD = getHistogram2(destImg);
		return indentification2(histR, histD);
	}
	
	public static double indentification2(double[] histR, double[] histD) {
		double p = (double) 0.0;
		for(int i=0; i<histR.length; i++) {
			p += Math.sqrt(histR[i]*histD[i]);
		}
		return p;
	}
/**
	 * 用一维直方图求图像的相似度
	 * @param n
	 * @param str1
	 * @param str2
	 */
	public static void histogramIditification2(int n, String str1, String str2) {
		double p = 0;
		double[] histR = GreyIdentification.getHistgram2(str1); 
		double[] histD = null;
		for(int i=0; i<n; i++) {
			histD = GreyIdentification.getHistgram2(str2 + (i+1) + ".jpg");
			p = GreyIdentification.indentification2(histR, histD);
			System.out.print((i+1) + "--" + p + "    ");
		}
	}

效果

源图像(要搜索的图像)


要被搜索的图像


搜索的结果,相似度从大到小


分享到:
评论

相关推荐

    基于灰度直方图的图像检索

    总结来说,"基于灰度直方图的图像检索"是一个利用VC++实现的图像处理应用,它通过计算和比较图像的灰度直方图来找出与查询图像相似的.bmp图像。这个过程涉及图像的灰度化、直方图计算、相似性度量以及可能的优化技术...

    基于直方图的图像检索

    基于直方图的图像检索是指通过比较不同图像的直方图来判断它们之间的相似性,进而实现对图像内容的搜索和匹配。 在直方图的计算过程中,通常会将图像的像素值划分为若干个等间隔的区间,每个区间代表一个“bin”,...

    基于边缘直方图的图像检索

    综上所述,基于边缘直方图的图像检索是一种有效的图像检索方法,它通过对图像边缘特征的提取和匹配实现了图像间的相似性度量。通过本次实验的学习和实践,我们不仅掌握了MATLAB中图像处理的基本技能,还深入了解了...

    基于颜色直方图的图像检索

    在“基于颜色直方图的图像检索”中,我们主要关注如何利用图像的颜色分布信息进行图像的相似性比较和搜索。MATLAB作为一种强大的数值计算和数据可视化工具,经常被用于图像处理和计算机视觉的实验与开发。 颜色直方...

    直方图构建图像搜索引擎二code

    总之,直方图在构建图像搜索引擎中的作用不可忽视,它提供了一种快速且直观的方式来比较图像的颜色特征。通过理解直方图构建的原理和相关算法,我们可以更好地设计和优化图像检索系统,提高搜索效率和准确性。

    基于内容的图像检索系统 颜色直方图

    总的来说,基于内容的图像检索系统通过颜色直方图等特征提取技术,能够实现高效且直观的图像搜索。然而,为了提高检索精度,我们需要结合多种图像特征,并设计合适的融合策略。MATLAB作为一种强大的工具,可以帮助...

    使用直方图比较检索相似图像

    3. **Chi-Square**(卡方):基于统计学的卡方检验,衡量两个直方图的差异。值越小,表明两个直方图越相似。 4. **Kullback-Leibler Divergence**(KL散度):衡量一个概率分布相对于另一个概率分布的“距离”。在...

    基于颜色直方图的图像检索(实验分析).doc

    【图像检索技术】基于颜色直方图的图像检索是一种常用的方法,主要应用于互联网上的大量...尽管存在高维度和计算复杂性的问题,但通过不断的技术优化和特征融合,可以有效地提升检索性能,满足用户对图像搜索的需求。

    matlab环境下的,基于图像颜色特征的图像检索源代码

    3. 图像表示:将提取的颜色特征转化为适合于比较的形式,比如使用向量或直方图。 4. 相似度计算:通过计算查询图像与数据库中每张图像的特征向量之间的距离(如欧氏距离、余弦相似度等)来评估它们的相似性。 5. ...

    opencv基于颜色直方图进行模板图像匹配检测的程序

    在给定的程序中,开发者使用了OpenCV来实现一种基于颜色直方图的模板图像匹配方法。这种方法可以有效地比较两个图像的色彩分布,从而确定它们之间的相似性。 颜色直方图是表示图像颜色分布的一种统计图形。在二维或...

    【图像检索】基于综合特征的图像检索含Matlab源码.zip

    例如,`imread`和`imshow`函数用于读取和显示图像,`imhist`用于计算颜色直方图,`extractFeatures`可以提取诸如SIFT或LBP的特征,`flann`模块用于快速近似最近邻搜索。 在提供的"【图像检索】基于综合特征的图像...

    VC++实现图像检索技术基于子块颜色直方图方法

    在这个场景中,"VC++实现图像检索技术基于子块颜色直方图方法" 提供了一种有效的解决方案。下面将详细介绍这个方法及其相关知识点。 颜色直方图是描述图像颜色分布的一种统计方法,通过计算每个颜色通道(如红、绿...

    基于C_的图像颜色特征值的提取与匹配

    本文首先介绍了基于内容的图像检索的概念和特点,然后详细介绍了基于 C# 语言实现的图像颜色直方图的提取和匹配算法。 基于内容的图像检索是指利用图像本身的底层物理特征,如颜色、纹理、形状等,对图像进行索引和...

    基于颜色特征的图像检索系统

    【基于颜色特征的图像检索系统】是一种利用计算机视觉技术对图像进行分析和比较的方法,主要应用于数字图像库的管理和搜索。在本系统中,我们关注的是图像的颜色特性,因为颜色是人们识别图像最直观的特征之一。图像...

    论文研究-基于灰度直方图的图像分割方法 .pdf

    总结来说,本文研究的基于灰度直方图的自适应多目标图像分割方法,在理论和实践上都对图像分割技术的发展有所贡献。该方法有效地解决了传统OTSU算法在处理多类图像分割时遇到的效率和准确性的问题,为图像分割领域的...

Global site tag (gtag.js) - Google Analytics