感知哈希 ,平均哈希,差异值哈希
平均哈希
1.图片缩放,一般为8 8,或者3232
2.将图片灰度化
3.求平均值,并根据平均值将每一个像素二值化
4.将8*8=64位bit,每8个比特为一个十六进制值,转换成字符串,生成哈希值(指纹)
感知哈希
1.图片缩放 为32*32大小
2.将图片灰度化
3.对图片进行离散余弦变换(DCT),转换的频域
4.取频域左上角8*8大小(图片的能量都集中在低频部分,低频位于左上角)
5.计算64个DCT系数的均值平均值,并计算平均值二值化(同平均哈希)
6.生成哈希值
差异值哈希
1.图片缩放为9*8大小
2.将图片灰度化
3.差异值计算(每行相邻像素的差值,这样会生成8*8的差值,前一个像素大于后一个像素则为1,否则为0)
4.生成哈希值
import cv2
import numpy as np
import matplotlib.pylab as plt
def mean_hash(img):
"均值哈希"
img_s=cv2.resize(img,(8,8),interpolation=cv2.INTER_CUBIC)
img_gray=cv2.cvtColor(img_s,cv2.COLOR_BGR2GRAY)
s=0
hash_str=''
for i in range(8):
for j in range(8):
s=s+img_gray[i,j]
mean=s/64
for i in range(8):
for j in range(8):
if img_gray[i,j]>mean:
hash_str=hash_str+'1'
else:
hash_str=hash_str+'0'
return hash_str
def diff_hash(img):
# 差值感知算法
img_s=cv2.resize(img,(9,8),interpolation=cv2.INTER_CUBIC)
img_gray=cv2.cvtColor(img_s,cv2.COLOR_BGR2GRAY)
hash_str=''
for i in range(8):
for j in range(8):
if img_gray[i,j]>img_gray[i+1,j]:
hash_str=hash_str+'1'
else:
hash_str=hash_str+'0'
return hash_str
def per_hash(img):
img_s=cv2.resize(img,(32,32),interpolation=cv2.INTER_CUBIC)
img_gray=cv2.cvtColor(img_s,cv2.COLOR_BGR2GRAY)
img_gray=np.float32(img_gray)
img_DCT=cv2.dct(img_gray)
s=0
hash_str=''
for i in range(8):
for j in range(8):
s=img_DCT[i,j]+s
mean=s/64
for i in range(8):
for j in range(8):
if img_DCT[i,j]>mean:
img_DCT[i,j]=1
hash_str=hash_str+'1'
else:
img_DCT[i, j] = 0
hash_str+='0'
cv2.imshow(' ',img_DCT)
cv2.waitKey(0)
cv2.destroyAllWindows()
return hash_str
参考: https://blog.csdn.net/qq_32799915/article/details/81000437