亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java基于直方圖應用的相似圖片識別實例

 更新時間:2014年09月25日 10:55:12   投稿:shichen2014  
這篇文章主要介紹了Java基于直方圖應用的相似圖片識別實例,是非常實用的技巧,多見于圖形里游戲中,需要的朋友可以參考下

本文實例講述了Java實現(xiàn)基于直方圖應用的相似圖片識別,是非常實用的技巧。分享給大家供大家參考。具體分析如下:

一、算法概述:

首先對源圖像與要篩選的圖像進行直方圖數(shù)據(jù)采集,對采集的各自圖像直方圖進行歸一化再使用巴氏系數(shù)算法對直方圖數(shù)據(jù)進行計算,最終得出圖像相似度值,其值范圍在[0, 1]之間

0表示極其不同,1表示極其相似(相同)。

二、算法步驟詳解:

大致可以分為兩步,根據(jù)源圖像與候選圖像的像素數(shù)據(jù),生成各自直方圖數(shù)據(jù)。第二步:使用第一步輸出的直方圖結(jié)果,運用巴氏系數(shù)(Bhattacharyya coefficient)算法,計算出相似程度值。

第一步:直方圖計算

直方圖分為灰度直方圖與RGB直方圖,對于灰度圖像直方圖計算十分簡單,只要初始化一個大小為256的直方圖數(shù)組H,然后根據(jù)像素值完成頻率分布統(tǒng)計,假設像素值為124,則H[124] += 1, 而對于彩色RGB像素來說直方圖表達有兩種方式,一種是單一直方圖,另外一種是三維直方圖,三維直方圖比較簡單明了,分別對應RGB三種顏色,定義三個直方圖HR,HG, HB, 假設某一個像素點P的RGB值為(4, 231,129), 則對于的直方圖計算為HR[4] += 1,HG[231] += 1, HB[129] += 1, 如此對每個像素點完成統(tǒng)計以后,RGB彩色直方圖數(shù)據(jù)就生成了。

而RGB像素的單一直方圖SH表示稍微復雜點,每個顏色的值范圍為0 ~ 255之間的,假設可以分為一定范圍等份,當8等份時,每個等份的值范圍為32, 16等份時,每個等份值范圍為16,當4等份時候,每個等份值的范圍為64,假設RGB值為(14, 68, 221), 16等份之后,它對應直方圖索引值(index)分別為: (0, 4, 13), 根據(jù)計算索引值公式:index = R + G*16 + B*16*16

對應的直方圖index = 0 + 4*16 + 13 * 16 * 16, SH[3392] += 1

如此遍歷所有RGB像素值,完成直方圖數(shù)據(jù)計算。

第二步:巴氏系數(shù)計算,計算公式如下:

其中P, P'分別代表源與候選的圖像直方圖數(shù)據(jù),對每個相同i的數(shù)據(jù)點乘積開平方以后相加

得出的結(jié)果即為圖像相似度值(巴氏系數(shù)因子值),范圍為0到1之間。

程序效果如下圖所示:

相似度超過99%以上,極其相似

相似度為:72%, 一般相似

三、程序直方圖計算源代碼如下:

public void setGreenBinCount(int greenBinCount) { 
  this.greenBins = greenBinCount; 
} 
 
public void setBlueBinCount(int blueBinCount) { 
  this.blueBins = blueBinCount; 
} 
 
public float[] filter(BufferedImage src, BufferedImage dest) { 
  int width = src.getWidth(); 
    int height = src.getHeight(); 
     
    int[] inPixels = new int[width*height]; 
    float[] histogramData = new float[redBins * greenBins * blueBins]; 
    getRGB( src, 0, 0, width, height, inPixels ); 
    int index = 0; 
    int redIdx = 0, greenIdx = 0, blueIdx = 0; 
    int singleIndex = 0; 
    float total = 0; 
    for(int row=0; row<height; row++) { 
    int ta = 0, tr = 0, tg = 0, tb = 0; 
    for(int col=0; col<width; col++) { 
      index = row * width + col; 
      ta = (inPixels[index] >> 24) & 0xff; 
        tr = (inPixels[index] >> 16) & 0xff; 
        tg = (inPixels[index] >> 8) & 0xff; 
        tb = inPixels[index] & 0xff; 
        redIdx = (int)getBinIndex(redBins, tr, 255); 
        greenIdx = (int)getBinIndex(greenBins, tg, 255); 
        blueIdx = (int)getBinIndex(blueBins, tb, 255); 
        singleIndex = redIdx + greenIdx * redBins + blueIdx * redBins * greenBins; 
        histogramData[singleIndex] += 1; 
        total += 1; 
    } 
    } 
     
    // start to normalize the histogram data 
    for (int i = 0; i < histogramData.length; i++) 
    { 
    histogramData[i] = histogramData[i] / total; 
    } 
     
    return histogramData; 
} 

計算巴氏系數(shù)的代碼如下:

/** 
 * Bhattacharyya Coefficient 
 * http://www.cse.yorku.ca/~kosta/CompVis_Notes/bhattacharyya.pdf 
 * 
 * @return 
 */ 
public double modelMatch() { 
  HistogramFilter hfilter = new HistogramFilter(); 
  float[] sourceData = hfilter.filter(sourceImage, null); 
  float[] candidateData = hfilter.filter(candidateImage, null); 
  double[] mixedData = new double[sourceData.length]; 
  for(int i=0; i<sourceData.length; i++ ) { 
    mixedData[i] = Math.sqrt(sourceData[i] * candidateData[i]); 
  } 
   
  // The values of Bhattacharyya Coefficient ranges from 0 to 1, 
  double similarity = 0; 
  for(int i=0; i<mixedData.length; i++ ) { 
    similarity += mixedData[i]; 
  } 
   
  // The degree of similarity 
  return similarity; 
}

希望本文所述對大家的Java程序設計有所幫助。

相關(guān)文章

  • Java實現(xiàn)字節(jié)數(shù)B轉(zhuǎn)化為KB、MB、GB的方法示例【測試可用】

    Java實現(xiàn)字節(jié)數(shù)B轉(zhuǎn)化為KB、MB、GB的方法示例【測試可用】

    這篇文章主要介紹了Java實現(xiàn)字節(jié)數(shù)B轉(zhuǎn)化為KB、MB、GB的方法,結(jié)合實例形式分析了java字節(jié)數(shù)的轉(zhuǎn)換運算相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • 淺談hibernate之映射文件VS映射注解

    淺談hibernate之映射文件VS映射注解

    下面小編就為大家?guī)硪黄獪\談hibernate之映射文件VS映射注解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • SpringMVC中RequestContextHolder獲取請求信息的方法

    SpringMVC中RequestContextHolder獲取請求信息的方法

    這篇文章主要介紹了SpringMVC中RequestContextHolder獲取請求信息的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • ServletWebServerApplicationContext創(chuàng)建Web容器Tomcat示例

    ServletWebServerApplicationContext創(chuàng)建Web容器Tomcat示例

    這篇文章主要為大家介紹了ServletWebServerApplicationContext創(chuàng)建Web容器Tomcat示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Java實現(xiàn)簡單的斗地主游戲

    Java實現(xiàn)簡單的斗地主游戲

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單的斗地主游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • SpringBoot整合新版SpringSecurity完整過程

    SpringBoot整合新版SpringSecurity完整過程

    Spring Security是保障Spring應用程序安全的強大框架,而新版的Spring Security引入了lambda表達式來配置,使得安全配置更加簡潔、優(yōu)雅,本文將介紹如何在Spring Boot項目中整合新版Spring Security,需要的朋友可以參考下
    2024-02-02
  • Java比較器實現(xiàn)方法項目案例

    Java比較器實現(xiàn)方法項目案例

    這篇文章主要介紹了Java比較器實現(xiàn)方法,結(jié)合具體項目案例形式分析了Java比較器相關(guān)排序操作技巧,需要的朋友可以參考下
    2019-03-03
  • Java設計模式之命令模式(Command模式)介紹

    Java設計模式之命令模式(Command模式)介紹

    這篇文章主要介紹了Java設計模式之命令模式(Command模式)介紹,本文講解了Command模式的定義、如何使用命令模式等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • 基于JSON和java對象的互轉(zhuǎn)方法

    基于JSON和java對象的互轉(zhuǎn)方法

    下面小編就為大家?guī)硪黄贘SON和java對象的互轉(zhuǎn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • java基礎--自己動手實現(xiàn)一個LRU

    java基礎--自己動手實現(xiàn)一個LRU

    這篇文章主要介紹了運用方案如何實現(xiàn)LUR,文章中通過代碼講解的非常詳細,對大家的工作或?qū)W習有一定的參考價值,感興趣的朋友可以參考一下
    2021-08-08

最新評論