基于内容的图像检索(颜色,直方图相交法,)java实现代码

来源:互联网 发布:周星驰喜欢林允吗 知乎 编辑:程序博客网 时间:2024/06/05 09:31

直方图特征:

       对颜色特征的表达方式有许多种,我们采用直方图进行特征描述。常见的直方图有两种:统计直方图,累积直方图。我们将分别实验两种直方图在图像聚类和检索中的性能。
l         统计直方图
       为利用图像的特征描述图像,可借助特征的统计直方图。图像特征的统计直方图实际是一个1-D的离散函数,即:
       上式中k代表图像的特征取值,L是特征可取值个数,是图像中具有特征值为k的像素的个数,N是图像像素的总数,一个示例如下图:其中有8个直方条,对应图像中的8种灰度像素在总像素中的比例。

累积直方图 

                   0

                              0       1      2      3     4      5      6     7

2  直方图相似性度量
       得到图像特征的统计直方图后,不同图像之间的特征匹配可借助计算直方图间的相似度量来进行,以下介绍几种常见的直方图的相似度量方法:
l         直方图相交法
              另分别为两幅图像某一特征的统计直方图,则两图像之间的匹配值P(Q, D)可借助直方图相交来实现,即:

 

l         直方图匹配法
直方图间的距离可使用一般的欧式距离函数来衡量:
            我们可以实验多种相似性度量准则,研究它们之间的差异,找出对于某类图像,那种相似性度量能更加准确的描述两幅图像之间的相似程度。
代码:获取图片特征值为0~255的像素个数,并存入histgram[0][i],hisgram[1][i],hisgram[2][i]中,其中i>=0&&i<=255;
        
public static double [][] GetHistogram1(BufferedImage img){   double [][] histgram=new double [3][256];   int width=img.getWidth();//图片宽度   int height=img.getHeight();//图片高度   int pix[]= new int [width*height];//像素个数   int r,g,b;//记录R、G、B的值   pix = img.getRGB(0, 0, width, height, pix, 0, width);//将图片的像素值存到数组里   for(int i=0; i<width*height; i++)    {             r = pix[i]>>16 & 0xff; //提取R            g = pix[i]>>8 & 0xff;             b = pix[i] & 0xff;              histgram[0][r] ++;             histgram[1][g] ++;             histgram[2][b] ++;         }     double red =0,green=0,blue=0;   for(int j=0;j<256;j++){   red+=histgram[0][j];   green+=histgram[1][j];   blue+=histgram[2][j];   }   for(int j=0;j<256;j++)//将直方图每个像素值的总个数进行量化   {   histgram[0][j]/=red;   histgram[1][j]/=green;   histgram[2][j]/=blue;   }   return histgram;}

求相似度:

              欧式系数法

        

//欧式距离求图片的相似度public static double GetSimilarity2(double [][] Rhistgram,double  [][] Dhistgram){      double similar=(double)0.0;//相似度      for(int i=0;i<3;i++)      {      for(int j=0;j<Rhistgram[i].length;j++)      {      similar+=(Rhistgram[i][j]-Dhistgram[i][j])*(Rhistgram[i][j]-Dhistgram[i][j]);      }      }      similar=similar/6;      similar=Math.sqrt(similar);      //similar=similar/3;      return similar;}
求相似度:

               传统直方图相交法:

               

////  传统的直方图相交法  统计RGB  归一化 后用交来求两个图片的相似度public static double GetSimilarity1(double [][] Rhistgram,double  [][] Dhistgram){      double similar=(double)0.0;//相似度      for(int i=0;i<3;i++)      {      for(int j=0;j<Rhistgram[i].length;j++)      {      similar+=Math.min(Rhistgram[i][j], Dhistgram[i][j]);      }      }      similar=similar/3;      return similar;}

所有代码下载:http://download.csdn.net/detail/u014112584/7518319

                    

1 0
原创粉丝点击