概述
图像搜索现实的一般过程:
提取图像特征值→对特征值进行处理→匹配特征值
图像的特征值有很多,基于颜色特征,纹理特征,形状特征等,下面是基于图像颜色直方图特征的图像搜索。
(参考文章:http://blog.csdn.net/jia20003/article/details/7771651#comments)
原理
巴氏系数(Bhattacharyyacoefficient)算法
其中P, P’分别代表源与候选的图像直方图数据,对每个相同i的数据点乘积开平方以后相加
得出的结果即为图像相似度值(巴氏系数因子值),范围为0到1之间。为什么是到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格式的图像进行操作
基于边缘直方图的图像检索的matlab程序,比较详细。可以运行。
一个MATLAB程序,按图片的颜色进行搜索
题目基本要求是对图像能进行自动分类,先构建图库,在百度上搜索就行,...然后对图像进行特征提取,提取颜色直方图特征。再将特征转换为多维数组 然后按照libsvm的各种要求进行设置就基本ok,在论文中有详细的论述。
图像中的噪声会直接影响图像分割质量,为快速、准确地识别含噪图像中的目标,提出一种基于直方图预处理与BF算法的含噪图像分割方法。该方法通过小波变换抑制图像中的噪声,分析增强图像的直方图特点以缩小分割阈值的...
其中,基于颜色特征的检索,主要涉及颜色直方图的方法;基于纹理特征的检索,应用到灰度共生矩阵的方法。 关键字:基于内容的web图像检索技术;(CBIR);特征提取;图像分割;纹理分析;颜色直方图;灰度共生矩阵
图像的特征值有很多,基于颜色特征,纹理特征,形状特征等,该源码是基于图像颜色直方图特征的图像搜索。
在此基础上提出用距离直方图、角度直方图与傅立叶描述子来共同表示动力作用留下的形状特征。根据提取的鞋印图像的特征可以进一步挖掘出人的某些特征,如脚的大小、走路姿势等。最后给出了一个实验系统,结果表明基于...
图像特征也可以是局部图像特征,例如加速鲁棒特征 (SURF)、梯度直方图 (HOG) 或局部二进制模式 (LBP)。功能袋方法的好处是,可以自定义用于创建视觉单词词汇表的特征类型以适应应用程序。 图像搜索的速度和...
VC++实现图像检索技术基于子块颜色直方图方法!!
我们主要通过搜索直方图的峰或模式以及基于直方图的多阈值的方法来对方法进行计数。 本文中使用的是后者,它特别依赖于OTSU的多阈值方法。 然后,在i)图像的每个分量准确地接纳K个类别的情况下,通过最优配对来...
使用VC6.0集成开发环境初步实现了基于图片轮廓和图片颜色直方图的图像检索系统;对于给定的例子图像,系统搜索指定目录并根据与例子图像的颜色直方图或轮廓相似性程度数值按升序排列相符合的
基于图像内容的搜索,本源码详细注释,描述了如何利用图像的纹理特征,颜色特征进行搜索。其中有经过优化的LBP算法,HSV直方图算法,图像相似度计算等。 测试图片集是官方的图片测试集的子集,放在了google上,有...
2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,更多内容可点击博主头像 3.内容:标题所示,对于介绍可点击主页搜索博客 4.适合人群:本科,硕士...
提出了一种针对灰色直方图短时能量的高动态工业x射线图像的自动窗口算法。我们首先计算高位图像中短时帧直方图的平均能量值,然后使用双阈值来检测(inspection)包含有用信息的帧。最后,将检测到的帧的端点灰度值...
(2)针对最近邻插值效率低下、线性插值引入新的灰度影响联合直方图计算的问题,本文研究了PV插值技术,这种插值技术效率较高,不会引入新的灰度,有效地抑制了互信息的大幅度变换,有利于配准参数的优化。...
2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,更多内容可点击博主头像 3.内容:标题所示,对于介绍可点击主页搜索博客 4.适合人群:本科,硕士...
python计算机视觉编程——基于BOF的图像检索(附代码) 计算机视觉.pdf
提出了一种基于微粒群算法的区域生长图像分割方法,该方法利用微粒群较强的搜索能力搜索像素种子点。由于搜索像素种子点是按密度进行,计算量小,大幅度提高了算法的计算速度,同时克服了传统区域生长方法不能自动...
基于OpenCV的图像检索系统。使用VC6.0集成开发环境初步实现了基于图片轮廓和图片颜色直方图的图像...对于给定的例子图像,系统搜索指定目录并根据与例子图像的颜色直方图或轮廓相似性程度数值按升序排列相符合的图像。