Java基于直方圖應(yīng)用的相似圖片識(shí)別實(shí)例
本文實(shí)例講述了Java實(shí)現(xiàn)基于直方圖應(yīng)用的相似圖片識(shí)別,是非常實(shí)用的技巧。分享給大家供大家參考。具體分析如下:
一、算法概述:
首先對(duì)源圖像與要篩選的圖像進(jìn)行直方圖數(shù)據(jù)采集,對(duì)采集的各自圖像直方圖進(jìn)行歸一化再使用巴氏系數(shù)算法對(duì)直方圖數(shù)據(jù)進(jìn)行計(jì)算,最終得出圖像相似度值,其值范圍在[0, 1]之間
0表示極其不同,1表示極其相似(相同)。
二、算法步驟詳解:
大致可以分為兩步,根據(jù)源圖像與候選圖像的像素?cái)?shù)據(jù),生成各自直方圖數(shù)據(jù)。第二步:使用第一步輸出的直方圖結(jié)果,運(yùn)用巴氏系數(shù)(Bhattacharyya coefficient)算法,計(jì)算出相似程度值。
第一步:直方圖計(jì)算
直方圖分為灰度直方圖與RGB直方圖,對(duì)于灰度圖像直方圖計(jì)算十分簡(jiǎn)單,只要初始化一個(gè)大小為256的直方圖數(shù)組H,然后根據(jù)像素值完成頻率分布統(tǒng)計(jì),假設(shè)像素值為124,則H[124] += 1, 而對(duì)于彩色RGB像素來(lái)說(shuō)直方圖表達(dá)有兩種方式,一種是單一直方圖,另外一種是三維直方圖,三維直方圖比較簡(jiǎn)單明了,分別對(duì)應(yīng)RGB三種顏色,定義三個(gè)直方圖HR,HG, HB, 假設(shè)某一個(gè)像素點(diǎn)P的RGB值為(4, 231,129), 則對(duì)于的直方圖計(jì)算為HR[4] += 1,HG[231] += 1, HB[129] += 1, 如此對(duì)每個(gè)像素點(diǎn)完成統(tǒng)計(jì)以后,RGB彩色直方圖數(shù)據(jù)就生成了。
而RGB像素的單一直方圖SH表示稍微復(fù)雜點(diǎn),每個(gè)顏色的值范圍為0 ~ 255之間的,假設(shè)可以分為一定范圍等份,當(dāng)8等份時(shí),每個(gè)等份的值范圍為32, 16等份時(shí),每個(gè)等份值范圍為16,當(dāng)4等份時(shí)候,每個(gè)等份值的范圍為64,假設(shè)RGB值為(14, 68, 221), 16等份之后,它對(duì)應(yīng)直方圖索引值(index)分別為: (0, 4, 13), 根據(jù)計(jì)算索引值公式:index = R + G*16 + B*16*16
對(duì)應(yīng)的直方圖index = 0 + 4*16 + 13 * 16 * 16, SH[3392] += 1
如此遍歷所有RGB像素值,完成直方圖數(shù)據(jù)計(jì)算。
第二步:巴氏系數(shù)計(jì)算,計(jì)算公式如下:
其中P, P'分別代表源與候選的圖像直方圖數(shù)據(jù),對(duì)每個(gè)相同i的數(shù)據(jù)點(diǎn)乘積開(kāi)平方以后相加
得出的結(jié)果即為圖像相似度值(巴氏系數(shù)因子值),范圍為0到1之間。
程序效果如下圖所示:
相似度超過(guò)99%以上,極其相似
相似度為:72%, 一般相似
三、程序直方圖計(jì)算源代碼如下:
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; }
計(jì)算巴氏系數(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; }
希望本文所述對(duì)大家的Java程序設(shè)計(jì)有所幫助。
- Java使用opencv識(shí)別二維碼的完整步驟
- Java創(chuàng)建、識(shí)別條形碼和二維碼方法示例
- java使用電腦攝像頭識(shí)別二維碼
- 不到十行實(shí)現(xiàn)javaCV圖片OCR文字識(shí)別
- Windows下Java調(diào)用OCR進(jìn)行圖片識(shí)別
- java實(shí)現(xiàn)騰訊ocr圖片識(shí)別接口調(diào)用
- java圖片識(shí)別文字的方法
- java實(shí)現(xiàn)圖片文字識(shí)別ocr
- java指紋識(shí)別以及谷歌圖片識(shí)別技術(shù)源碼
- java實(shí)現(xiàn)識(shí)別二維碼圖片功能
相關(guān)文章
Java實(shí)現(xiàn)字節(jié)數(shù)B轉(zhuǎn)化為KB、MB、GB的方法示例【測(cè)試可用】
這篇文章主要介紹了Java實(shí)現(xiàn)字節(jié)數(shù)B轉(zhuǎn)化為KB、MB、GB的方法,結(jié)合實(shí)例形式分析了java字節(jié)數(shù)的轉(zhuǎn)換運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-08-08SpringMVC中RequestContextHolder獲取請(qǐng)求信息的方法
這篇文章主要介紹了SpringMVC中RequestContextHolder獲取請(qǐng)求信息的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04ServletWebServerApplicationContext創(chuàng)建Web容器Tomcat示例
這篇文章主要為大家介紹了ServletWebServerApplicationContext創(chuàng)建Web容器Tomcat示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Java實(shí)現(xiàn)簡(jiǎn)單的斗地主游戲
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的斗地主游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04SpringBoot整合新版SpringSecurity完整過(guò)程
Spring Security是保障Spring應(yīng)用程序安全的強(qiáng)大框架,而新版的Spring Security引入了lambda表達(dá)式來(lái)配置,使得安全配置更加簡(jiǎn)潔、優(yōu)雅,本文將介紹如何在Spring Boot項(xiàng)目中整合新版Spring Security,需要的朋友可以參考下2024-02-02Java比較器實(shí)現(xiàn)方法項(xiàng)目案例
這篇文章主要介紹了Java比較器實(shí)現(xiàn)方法,結(jié)合具體項(xiàng)目案例形式分析了Java比較器相關(guān)排序操作技巧,需要的朋友可以參考下2019-03-03Java設(shè)計(jì)模式之命令模式(Command模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之命令模式(Command模式)介紹,本文講解了Command模式的定義、如何使用命令模式等內(nèi)容,需要的朋友可以參考下2015-03-03基于JSON和java對(duì)象的互轉(zhuǎn)方法
下面小編就為大家?guī)?lái)一篇基于JSON和java對(duì)象的互轉(zhuǎn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09java基礎(chǔ)--自己動(dòng)手實(shí)現(xiàn)一個(gè)LRU
這篇文章主要介紹了運(yùn)用方案如何實(shí)現(xiàn)LUR,文章中通過(guò)代碼講解的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)有一定的參考價(jià)值,感興趣的朋友可以參考一下2021-08-08