java 图片相似度_GitHub - java51talk/image-similarity: 计算图片之间的相似度
ImageSimilarity
計算圖片相似度的應用很廣泛,如google、baidu、360等搜索引擎以圖搜圖的功能就是其典型應用。下面介紹介紹兩種算法:
感知哈希算法(Perceptual hash algorithm)
那這種技術的原理是什么呢?根據Neal Krawetz博士的解釋,原理非常簡單易懂。我們可以用一個快速算法,就達到基本的效果。這里的關鍵技術叫做感知哈希算法(Perceptual hash algorithm),它的作用是對每張圖片生成一個"指紋"(fingerprint)字符串,然后比較不同圖片的指紋。結果越接近,就說明圖片越相似。下面是一個最簡單的實現:
第一步,縮小尺寸。將圖片縮小到8x8的尺寸,總共64個像素。這一步的作用是去除圖片的細節,只保留結構、明暗等基本信息,摒棄不同尺寸、比例帶來的圖片差異。
第二步,簡化色彩。將縮小后的圖片,轉為64級灰度。也就是說,所有像素點總共只有64種顏色。
第三步,計算平均值。計算所有64個像素的灰度平均值。
第四步,比較像素的灰度。將每個像素的灰度,與平均值進行比較。大于或等于平均值,記為1;小于平均值,記為0。
第五步,計算哈希值。將上一步的比較結果,組合在一起,就構成了一個64位的整數,這就是這張圖片的指紋。組合的次序并不重要,只要保證所有圖片都采用同樣次序就行了。
得到指紋以后,就可以對比不同的圖片,看看64位中有多少位是不一樣的。在理論上,這等同于計算漢明距離(Hamming distance)。如果不相同的數據位不超過5,就說明兩張圖片很相似;如果大于10,就說明這是兩張不同的圖片。
具體的代碼實現,可以參見Wote用python語言寫的imgHash.py。代碼很短,只有53行。使用的時候,第一個參數是基準圖片,第二個參數是用來比較的其他圖片所在的目錄,返回結果是兩張圖片之間不相同的數據位數量(漢明距離)。
這種算法的優點是簡單快速,不受圖片大小縮放的影響,缺點是圖片的內容不能變更。如果在圖片上加幾個文字,它就認不出來了。所以,它的最佳用途是根據縮略圖,找出原圖。
實際應用中,往往采用更強大的pHash算法和SIFT算法,它們能夠識別圖片的變形。只要變形程度不超過25%,它們就能匹配原圖。這些算法雖然更復雜,但是原理與上面的簡便算法是一樣的,就是先將圖片轉化成Hash字符串,然后再進行比較。
直方圖
直方圖算法是對源圖像與要篩選的圖像進行直方圖數據采集,對采集的各自圖像直方圖進行歸一化再使用巴氏系數算法對直方圖數據進行計算,最終得出圖像相似度值,其值范圍在[0, 1]之間0表示極其不同,1表示極其相似(相同)。
算法步驟大致可以分為兩步,根據源圖像與候選圖像的像素數據,生成各自直方圖數據。第二步:使用第一步輸出的直方圖結果,運用巴氏系數(Bhattacharyya coefficient)算法,計算出相似程度值。
第一步:直方圖計算
直方圖分為灰度直方圖與RGB直方圖,對于灰度圖像直方圖計算十分簡單,只要初始化一個大小為256的直方圖數組H,然后根據像素值完成頻率分布統計,假設像素值為124,則H[124] += 1, 而對于彩色RGB像素來說直方圖表達有兩種方式,一種是單一直方圖,另外一種是三維直方圖,三維直方圖比較簡單明了,分別對應RGB三種顏色,定義三個直方圖HR,HG, HB, 假設某一個像素點P的RGB值為(4, 231,129), 則對于的直方圖計算為HR[4] += 1,HG[231] += 1, HB[129] += 1, 如此對每個像素點完成統計以后,RGB彩色直方圖數據就生成了。
而RGB像素的單一直方圖SH表示稍微復雜點,每個顏色的值范圍為0 ~ 255之間的,假設可以分為一定范圍等份,當8等份時,每個等份的值范圍為32, 16等份時,每個等份值范圍為16,當4等份時候,每個等份值的范圍為64,假設RGB值為(14, 68, 221), 16等份之后,它對應直方圖索引值(index)分別為: (0, 4, 13), 根據計算索引值公式:index = R + G16 + B1616 對應的直方圖index = 0 + 416 + 13 * 16 * 16, SH[3392] += 1如此遍歷所有RGB像素值,完成直方圖數據計算。
第二步:巴氏系數計算,計算公式如下:。其中p, p’分別代表源與候選的圖像直方圖數據,對每個相同i的數據點乘積開平方以后相加得出的結果即為圖像相似度值(巴氏系數因子值),范圍為0到1之間。
本項目的兩種算法因為都存在一定的誤判,所以可以兩種方法結合在一起使用,提高準確率。
參考資料:
總結
以上是生活随笔為你收集整理的java 图片相似度_GitHub - java51talk/image-similarity: 计算图片之间的相似度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ATM维护人员教大家正确使用银行卡和取款
- 下一篇: 如何使用SC7A20