1. 程式人生 > >基於內容的影象檢索(顏色,直方圖相交法,)java實現程式碼

基於內容的影象檢索(顏色,直方圖相交法,)java實現程式碼

直方圖特徵:

       對顏色特徵的表達方式有許多種,我們採用直方圖進行特徵描述。常見的直方圖有兩種:統計直方圖,累積直方圖。我們將分別實驗兩種直方圖在影象聚類和檢索中的效能。 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;
	}