相似图像搜索的哈希算法思想及实现(差值哈希算法和均值哈希算法)
圖像相似度比較哈希算法:
什么是哈希(Hash)?
? 散列函數(shù)(或散列算法,又稱哈希函數(shù),英語(yǔ):Hash Function)是一種從任何一種數(shù)據(jù)中創(chuàng)建小 的數(shù)字“指紋”的方法。散列函數(shù)把消息或數(shù)據(jù)壓縮成摘要,使得數(shù)據(jù)量變小,將數(shù)據(jù)的格式固定 下來。該函數(shù)將數(shù)據(jù)打亂混合,重新創(chuàng)建一個(gè)叫做散列值(hash values,hash codes,hash sums, 或hashes)的指紋。散列值通常用一個(gè)短的隨機(jī)字母和數(shù)字組成的字符串來代表。
? 通過哈希算法得到的任意長(zhǎng)度的二進(jìn)制值映射為較短的固定長(zhǎng)度的二進(jìn)制值,即哈希值。此外, 哈希值是一段數(shù)據(jù)唯一且極其緊湊的數(shù)值表示形式,如果通過哈希一段明文得到哈希值,哪怕只 更改該段明文中的任意一個(gè)字母,隨后得到的哈希值都將不同。
? 哈希算法是一個(gè)函數(shù),能夠把幾乎所有的數(shù)字文件都轉(zhuǎn)換成一串由數(shù)字和字母構(gòu)成的看似亂碼的 字符串。
哈希函數(shù)的特點(diǎn)
哈希函數(shù)作為一種加密函數(shù),其擁有兩個(gè)最重要特點(diǎn):
哈希算法的種類
哈希算法是一類算法的總稱,共有三種:
漢明距離
兩個(gè)整數(shù)之間的漢明距離指的是這兩個(gè)數(shù)字對(duì)應(yīng)二進(jìn)制位不同的位置的數(shù)目。
 
均值哈希算法
步驟:
差值哈希算法
差值哈希算法相較于均值哈希算法,前期和后期基本相同,只有中間比較hash有變化。
步驟:
感知哈希算法
均值哈希算法過于嚴(yán)格,不夠精確,更適合搜索縮略圖,為了獲得更精確的結(jié)果可以選擇感知哈希 算法,它采用的是DCT(離散余弦變換)來降低頻率的方法。
步驟:
代碼實(shí)現(xiàn):均值哈希算法和差值哈希算法
import cv2 import numpy as np#均值哈希算法 def aHash(img):#縮放為8*8img=cv2.resize(img,(8,8),interpolation=cv2.INTER_CUBIC)#轉(zhuǎn)換為灰度圖gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#s為像素和初值為0,hash_str為hash值初值為''s=0hash_str=''#遍歷累加求像素和for i in range(8):for j in range(8):s=s+gray[i,j]#求平均灰度avg=s/64#灰度大于平均值為1相反為0生成圖片的hash值for i in range(8):for j in range(8):if gray[i,j]>avg:hash_str=hash_str+'1'else:hash_str=hash_str+'0' return hash_str#差值感知算法 def dHash(img):#縮放8*9img=cv2.resize(img,(9,8),interpolation=cv2.INTER_CUBIC)#轉(zhuǎn)換灰度圖gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)hash_str=''#每行前一個(gè)像素大于后一個(gè)像素為1,相反為0,生成哈希for i in range(8):for j in range(8):if gray[i,j]>gray[i,j+1]:hash_str=hash_str+'1'else:hash_str=hash_str+'0'return hash_str#Hash值對(duì)比 def cmpHash(hash1,hash2):n=0#hash長(zhǎng)度不同則返回-1代表傳參出錯(cuò)if len(hash1)!=len(hash2):return -1#遍歷判斷for i in range(len(hash1)):#不相等則n計(jì)數(shù)+1,n最終為相似度if hash1[i]!=hash2[i]:n=n+1return nimg1=cv2.imread('lenna.png') img2=cv2.imread('lenna_noise.png') hash1= aHash(img1) hash2= aHash(img2) print(hash1) print(hash2) n=cmpHash(hash1,hash2) print('均值哈希算法相似度:',n)hash1= dHash(img1) hash2= dHash(img2) print(hash1) print(hash2) n=cmpHash(hash1,hash2) print('差值哈希算法相似度:',n)運(yùn)行結(jié)果:
輸入:
 
 
 輸出:
 
圖像相似度比較哈希算法
三種算法的比較:
 ? aHash:均值哈希。速度比較快,但是常常不太精確。
 ? pHash:感知哈希。精確度較高,但是速度方面較差一些。
 ? dHash:差值哈希。精確度較高,且速度也非常快。
 ? 均值哈希本質(zhì)上是對(duì)顏色的比較;
 ? 感知哈希由于做了 DCT 操作,本質(zhì)上是對(duì)頻率的比較;
 ? 差值哈希本質(zhì)上是基于漸變的感知哈希算法。
總結(jié)
以上是生活随笔為你收集整理的相似图像搜索的哈希算法思想及实现(差值哈希算法和均值哈希算法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 最小二乘法以及RANSAC(随机采样一致
 - 下一篇: 准爸爸梦到生女儿是胎梦吗