以圖搜圖:Python實(shí)現(xiàn)dHash算法

向AI轉(zhuǎn)型的程序員都關(guān)注了這個(gè)號(hào)??????
機(jī)器學(xué)習(xí)AI算法工程?? 公眾號(hào):datayx
期研究了一下以圖搜圖這個(gè)炫酷的東西。百度和谷歌都有提供以圖搜圖的功能,有興趣可以找一下。當(dāng)然,不是很深入。深入的話,得運(yùn)用到深度學(xué)習(xí)這貨。Python深度學(xué)習(xí)當(dāng)然不在話下。
這個(gè)功能最核心的東西就是怎么讓電腦識(shí)別圖片。
這個(gè)問(wèn)題也是困擾了我,在偶然的機(jī)會(huì),看到哈希感知算法。這個(gè)分兩種,一種是基本的均值哈希感知算法(dHash),一種是余弦變換哈希感知算法(pHash)。dHash是我自己命名的,為了和pHash區(qū)分。這里兩種方法,我都用Python實(shí)現(xiàn)了^_^
哈希感知算法基本原理如下:
1、把圖片轉(zhuǎn)成一個(gè)可識(shí)別的字符串,這個(gè)字符串也叫哈希值
2、和其他圖片匹配字符串
算法不是耍耍嘴皮子就行了,重點(diǎn)是怎么把圖片變成一個(gè)可識(shí)別的字符串。(鄙視網(wǎng)上那些抄來(lái)抄去的文章,連字都一模一樣)拿一張圖片舉例。

首先,把這個(gè)圖片縮小到8x8大小,并改成灰度模式。這樣是為了模糊化處理圖片,并減少計(jì)算量。
8x8的圖片太小了,放大圖片給大家看一下。

x8大小的圖片就是有64個(gè)像素值。計(jì)算這64個(gè)像素的平均值,進(jìn)一步降噪處理。
像素值=[
? ? ?247, 245, 250, 253, 251, 244, 240, 240,?
? ? ?247, 253, 228, 208, 213, 243, 247, 241,?
? ? ?252, 226, 97, 80, 88, 116, 231, 247,?
? ? ?255, 172, 79, 65, 51, 58, 191, 255,?
? ? ?255, 168, 71, 60, 53, 69, 205, 255,?
? ? ?255, 211, 65, 58, 56, 104, 244, 252,?
? ? ?248, 253, 119, 42, 53, 181, 252, 243,?
? ? ?244, 240, 218, 175, 185, 230, 242, 244]
平均值=185.359375
得到這個(gè)平均值之后,再和每個(gè)像素對(duì)比。像素值大于平均值的標(biāo)記成1,小于或等于平均值的標(biāo)記成0。組成64個(gè)數(shù)字的字符串(看起來(lái)也是一串二進(jìn)制的)。
降噪結(jié)果=[
? ? ? ?1, 1, 1, 1, 1, 1, 1, 1,?
? ? ? ?1, 1, 1, 1, 1, 1, 1, 1,?
? ? ? ?1, 1, 0, 0, 0, 0, 1, 1,?
? ? ? ?1, 0, 0, 0, 0, 0, 1, 1,?
? ? ? ?1, 0, 0, 0, 0, 0, 1, 1,?
? ? ? ?1, 1, 0, 0, 0, 0, 1, 1,?
? ? ? ?1, 1, 0, 0, 0, 0, 1, 1,?
? ? ? ?1, 1, 1, 0, 0, 1, 1, 1]
64位字符串 =
'1111111111111111110000111000001110000011110000111100001111100111'
由于64位太長(zhǎng),比較起來(lái)也麻煩。每4個(gè)字符為1組,由2進(jìn)制轉(zhuǎn)成16進(jìn)制。這樣就剩下一個(gè)長(zhǎng)度為16的字符串。這個(gè)字符串也就是這個(gè)圖片可識(shí)別的哈希值。
哈希值 = 'ffffc38383c3c3e7'
Python代碼如下:

看看其他圖片的哈希值:



這3張圖片的哈希值分別和a.jpg(舉例的那張圖片)的哈希值對(duì)比。對(duì)比方法用漢明距離:相同位置上的字符不同的個(gè)數(shù)。例如a.jpg和b.jpg對(duì)比

有11個(gè)位置的字符不一樣,則漢明距離是11。漢明距離越小就說(shuō)明圖片越相識(shí)。超過(guò)10就說(shuō)明圖片很不一樣。
a.jpg和c.jpg的漢明距離是8;
a.jpg和d.jpg的漢明距離是7。
說(shuō)明在這3張圖片中,d.jpg和a.jpg最相似。
大致算法就是這樣,漢明距離的代碼我沒(méi)給出,這個(gè)比較簡(jiǎn)單。一般都是在數(shù)據(jù)庫(kù)里面進(jìn)行計(jì)算,得到比較小的那些圖片感知哈希值。
當(dāng)然,實(shí)際應(yīng)用中很少用這種算法,因?yàn)檫@種算法比較敏感。同一張圖片旋轉(zhuǎn)一定角度或者變形一下,那個(gè)哈希值差別就很大。不過(guò),它的計(jì)算速度是最快的,通??梢杂糜诓檎铱s略圖。
現(xiàn)有3張圖片,用前面的dHash均值哈希感知算法計(jì)算哈希值。



Hash均值哈希感知算法計(jì)算結(jié)果:
1.jpg:270f078fd1fdffff
2.jpg:f8f0e1f0eaefcfff
3.jpg:e70f058f81f1f1ff
1.jpg和2.jpg(旋轉(zhuǎn)90度)的漢明距離是13;1.jpg和3.jpg(旋轉(zhuǎn)5度)的漢明距離是5。(漢明距離是兩個(gè)字符串對(duì)應(yīng)位置對(duì)比,總共不同的個(gè)數(shù))
很明顯,旋轉(zhuǎn)了90度漢明距離變得很大。在dHash算法中,它們是不同的。而我們?nèi)庋劭梢钥闯銎鋵?shí)是一樣的。前面說(shuō)過(guò)dHash算法比較較真、比較敏感。若要處理一定程度的變形,得要調(diào)整一下這個(gè)算法。
pHash算法就是基于dHash算法調(diào)整而來(lái)的,用第一次計(jì)算得到的值進(jìn)行余弦變換。所以命名為余弦哈希感知算法。它可以識(shí)別變形程度在25%以內(nèi)的圖片。
大致原理和處理過(guò)程是這樣:
把圖片縮小到32x32的尺寸,并轉(zhuǎn)為灰度模式。

得到這個(gè)平均值之后,再和每個(gè)像素對(duì)比。像素值大于平均值的標(biāo)記成1,小于或等于平均值的標(biāo)記成0。組成64個(gè)數(shù)字的字符串(看起來(lái)也是一串二進(jìn)制的)。
降噪結(jié)果 =?[
? ? 0, 1, 1, 1, 0, 0, 1, 1,
? ? 0, 1, 1, 0, 0, 0, 0, 1,
? ? 0, 0, 0, 0, 0, 0, 0, 0,
? ? 0, 0, 0, 0, 0, 0, 0, 0,
? ? 1, 1, 1, 1, 1, 1, 1, 1,
? ? 1, 1, 1, 1, 1, 1, 1, 1,
? ? 0, 0, 0, 1, 1, 1, 0, 0,
? ? 0, 0, 0, 0, 0, 0, 0, 0]
64位字符串 = '0111001101100001000000000000000011111111111111110001110000000000'
每4個(gè)數(shù)字,由2進(jìn)制轉(zhuǎn)成16進(jìn)制,得到哈希值 = '73610000ffff1c00'
Python代碼如下:


用這個(gè)算法計(jì)算2.jpg和3.jpg的哈希值和與1.jpg對(duì)比的漢明距離分別是:
2.jpg:7ffc0000ffffe000,漢明距離是5
3.jpg:7fff0000fffff800,漢明距離是5
很明顯,pHash算法得到的漢明距離更加符合我們的要求。
????
原文地址
https://yshblog.com/blog/44
機(jī)器學(xué)習(xí)算法AI大數(shù)據(jù)技術(shù)
?搜索公眾號(hào)添加:?datanlp
長(zhǎng)按圖片,識(shí)別二維碼
閱讀過(guò)本文的人還看了以下文章:
TensorFlow 2.0深度學(xué)習(xí)案例實(shí)戰(zhàn)
基于40萬(wàn)表格數(shù)據(jù)集TableBank,用MaskRCNN做表格檢測(cè)
《基于深度學(xué)習(xí)的自然語(yǔ)言處理》中/英PDF
Deep Learning 中文版初版-周志華團(tuán)隊(duì)
【全套視頻課】最全的目標(biāo)檢測(cè)算法系列講解,通俗易懂!
《美團(tuán)機(jī)器學(xué)習(xí)實(shí)踐》_美團(tuán)算法團(tuán)隊(duì).pdf
《深度學(xué)習(xí)入門:基于Python的理論與實(shí)現(xiàn)》高清中文PDF+源碼
《深度學(xué)習(xí):基于Keras的Python實(shí)踐》PDF和代碼
python就業(yè)班學(xué)習(xí)視頻,從入門到實(shí)戰(zhàn)項(xiàng)目
2019最新《PyTorch自然語(yǔ)言處理》英、中文版PDF+源碼
《21個(gè)項(xiàng)目玩轉(zhuǎn)深度學(xué)習(xí):基于TensorFlow的實(shí)踐詳解》完整版PDF+附書代碼
《深度學(xué)習(xí)之pytorch》pdf+附書源碼
PyTorch深度學(xué)習(xí)快速實(shí)戰(zhàn)入門《pytorch-handbook》
【下載】豆瓣評(píng)分8.1,《機(jī)器學(xué)習(xí)實(shí)戰(zhàn):基于Scikit-Learn和TensorFlow》
《Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)》PDF+完整源碼
汽車行業(yè)完整知識(shí)圖譜項(xiàng)目實(shí)戰(zhàn)視頻(全23課)
李沐大神開源《動(dòng)手學(xué)深度學(xué)習(xí)》,加州伯克利深度學(xué)習(xí)(2019春)教材
筆記、代碼清晰易懂!李航《統(tǒng)計(jì)學(xué)習(xí)方法》最新資源全套!
《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》最新2018版中英PDF+源碼
將機(jī)器學(xué)習(xí)模型部署為REST API
FashionAI服裝屬性標(biāo)簽圖像識(shí)別Top1-5方案分享
重要開源!CNN-RNN-CTC 實(shí)現(xiàn)手寫漢字識(shí)別
同樣是機(jī)器學(xué)習(xí)算法工程師,你的面試為什么過(guò)不了?
前海征信大數(shù)據(jù)算法:風(fēng)險(xiǎn)概率預(yù)測(cè)
【Keras】完整實(shí)現(xiàn)‘交通標(biāo)志’分類、‘票據(jù)’分類兩個(gè)項(xiàng)目,讓你掌握深度學(xué)習(xí)圖像分類
VGG16遷移學(xué)習(xí),實(shí)現(xiàn)醫(yī)學(xué)圖像識(shí)別分類工程項(xiàng)目
特征工程(二) :文本數(shù)據(jù)的展開、過(guò)濾和分塊
如何利用全新的決策樹集成級(jí)聯(lián)結(jié)構(gòu)gcForest做特征工程并打分?
Machine Learning Yearning 中文翻譯稿
全球AI挑戰(zhàn)-場(chǎng)景分類的比賽源碼(多模型融合)
斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)
python+flask搭建CNN在線識(shí)別手寫中文網(wǎng)站
中科院Kaggle全球文本匹配競(jìng)賽華人第1名團(tuán)隊(duì)-深度學(xué)習(xí)與特征工程
不斷更新資源
深度學(xué)習(xí)、機(jī)器學(xué)習(xí)、數(shù)據(jù)分析、python
?搜索公眾號(hào)添加:?datayx??
