基於感知哈希算法的中藥標本相似圖片的搜索

一 前言

筆者最近在開發中藥標本相似圖片的搜索,就是根據用戶上傳的圖片,然後到中藥標本庫裏找到相似的圖片,從而幫助用戶識別標本,獲取標本信息。查閱了大量資料,看到了阮一峯的一篇文章,經過一個月的開發終於完成

二 下面是阮一峯的一個最簡單的實現(原文點擊打開鏈接

你輸入Google圖片的網址,或者直接上傳圖片,Google就會找出與其相似的圖片。下面這張圖片是美國女演員Alyson Hannigan。


上傳後,Google返回如下結果:


這種技術的原理是什麼?計算機怎麼知道兩張圖片相似呢?
根據Neal Krawetz博士的解釋,原理非常簡單易懂。我們可以用一個快速算法,就達到基本的效果。
這裏的關鍵技術叫做"感知哈希算法"(Perceptual hash algorithm),它的作用是對每張圖片生成一個"指紋"(fingerprint)字符串,然後比較不同圖片的指紋。結果越接近,就說明圖片越相似。


下面是一個最簡單的實現:
第一步,縮小尺寸。
將圖片縮小到8x8的尺寸,總共64個像素。這一步的作用是去除圖片的細節,只保留結構、明暗等基本信息,摒棄不同尺寸、比例帶來的圖片差異。


第二步,簡化色彩。
將縮小後的圖片,轉爲64級灰度。也就是說,所有像素點總共只有64種顏色。


第三步,計算平均值。
計算所有64個像素的灰度平均值。

第四步,比較像素的灰度。
將每個像素的灰度,與平均值進行比較。大於或等於平均值,記爲1;小於平均值,記爲0。

第五步,計算哈希值。
將上一步的比較結果,組合在一起,就構成了一個64位的整數,這就是這張圖片的指紋。組合的次序並不重要,只要保證所有圖片都採用同樣次序就行了。


得到指紋以後,就可以對比不同的圖片,看看64位中有多少位是不一樣的。在理論上,這等同於計算"漢明距離"(Hamming distance)。如果不相同的數據位不超過5,就說明兩張圖片很相似;如果大於10,就說明這是兩張不同的圖片。

這種算法的優點是簡單快速,不受圖片大小縮放的影響,缺點是圖片的內容不能變更。如果在圖片上加幾個文字,它就認不出來了。所以,它的最佳用途是根據縮略圖,找出原圖。實際應用中,往往採用更強大的pHash算法和SIFT算法,它們能夠識別圖片的變形。只要變形程度不超過25%,它們就能匹配原圖。這些算法雖然更復雜,但是原理與上面的簡便算法是一樣的,就是先將圖片轉化成Hash字符串,然後再進行比較。

三  基於感知哈希算法的中藥標本相似圖片的搜索
在參考了阮一峯的思路後,自己開發了基於感知哈希算法的中藥標本相似圖片的搜索,本打算用比較熟悉的java開發的,但是想嘗試一下php的開發速度,於是最終採用了php開發此係統,php自帶的GD圖像處理函數還是很方便的,下面簡單介紹一下系統
1.用戶上傳查詢圖片界面


用戶選擇圖片文件後,單擊上傳即可進行圖片的上傳,採用ajax返回,同時用戶可以在線圖片進行剪裁,這裏主要採用了jcrop插件

單擊圖像識別後,就可以到數據庫裏查找相似圖片了,這裏主要是用php實現了上面說的感知哈希算法,計算用戶上傳圖片的指紋編碼和數據庫中標本圖片指紋編碼進行比對,如果小於10就認爲它們是相似的。

單擊找到的記錄名稱,即可查看該相似標本的詳細信息,爲了很好的用戶體驗,這裏的彈出框主要採用了fancybox

2.系統後臺界面(超過10條記錄就會出現分頁,這裏我才添加了7條記錄,呵呵)


數據添加界面(這裏的富文本編輯器主要採用了KindEditor,數據採用ajax提交,用了jquery.form):


由於時間倉促,源代碼還在整理中,等整理好了,會考慮開源。

參考資料:http://www.ruanyifeng.com/blog/2011/07/principle_of_similar_image_search.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章