基於內容的影象檢索(顏色,直方圖相交法,)java實現程式碼
阿新 • • 發佈:2019-02-07
直方圖特徵:
對顏色特徵的表達方式有許多種,我們採用直方圖進行特徵描述。常見的直方圖有兩種:統計直方圖,累積直方圖。我們將分別實驗兩種直方圖在影象聚類和檢索中的效能。 l統計直方圖 為利用影象的特徵描述影象,可藉助特徵的統計直方圖。影象特徵的統計直方圖實際是一個1-D的離散函式,即: 上式中k代表影象的特徵取值,L是特徵可取值個數,是影象中具有特徵值為k的畫素的個數,N是影象畫素的總數,一個示例如下圖:其中有8個直方條,對應影象中的8種灰度畫素在總畫素中的比例。累積直方圖
0
0 1 2 3 4 5 6 7
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;
}