个人备案网站,用dw做旅游网站的方法,中国石家庄网站,那些网站专门做棋牌推广的图像相似度比较哈希算法:
什么是哈希#xff08;Hash#xff09;#xff1f;
• 散列函数#xff08;或散列算法#xff0c;又称哈希函数#xff0c;英语#xff1a;Hash Function#xff09;是一种从任何一种数据中创建小 的数字“指纹”的方法。散列函数把消息或数…图像相似度比较哈希算法:
什么是哈希Hash
• 散列函数或散列算法又称哈希函数英语Hash Function是一种从任何一种数据中创建小 的数字“指纹”的方法。散列函数把消息或数据压缩成摘要使得数据量变小将数据的格式固定 下来。该函数将数据打乱混合重新创建一个叫做散列值hash valueshash codeshash sums 或hashes的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。
• 通过哈希算法得到的任意长度的二进制值映射为较短的固定长度的二进制值即哈希值。此外 哈希值是一段数据唯一且极其紧凑的数值表示形式如果通过哈希一段明文得到哈希值哪怕只 更改该段明文中的任意一个字母随后得到的哈希值都将不同。
• 哈希算法是一个函数能够把几乎所有的数字文件都转换成一串由数字和字母构成的看似乱码的 字符串。
哈希函数的特点
哈希函数作为一种加密函数其拥有两个最重要特点
不可逆性。输入信息得出输出的那个看似乱码的字符串哈希值非常容易但是从输出的字符 串反推出输入的结果却是却非常非常难。输出值唯一性和不可预测性。只要输入的信息有一点点区别那么根据哈希算法得出来的输出值 也相差甚远。
哈希算法的种类
哈希算法是一类算法的总称共有三种
均值哈希算法aHash差值哈希算法dHash感知哈希算法pHash
汉明距离
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
均值哈希算法
步骤
缩放图片缩放为8*8保留结构除去细节。灰度化转换为灰度图。求平均值计算灰度图所有像素的平均值。比较像素值大于平均值记作1相反记作0总共64位。生成hash将上述步骤生成的1和0按顺序组合起来既是图片的指纹hash。对比指纹将两幅图的指纹对比计算汉明距离即两个64位的hash值有多少位是不一样的不 相同位数越少图片越相似。
差值哈希算法
差值哈希算法相较于均值哈希算法前期和后期基本相同只有中间比较hash有变化。
步骤
缩放图片缩放为8*9保留结构除去细节。灰度化转换为灰度图。求平均值计算灰度图所有像素的平均值。比较像素值大于后一个像素值记作1相反记作0。本行不与下一行对比每行9个像素 八个差值有8行总共64位生成hash将上述步骤生成的1和0按顺序组合起来既是图片的指纹hash。对比指纹将两幅图的指纹对比计算汉明距离即两个64位的hash值有多少位是不一样 的不相同位数越少图片越相似。
感知哈希算法
均值哈希算法过于严格不够精确更适合搜索缩略图为了获得更精确的结果可以选择感知哈希 算法它采用的是DCT离散余弦变换来降低频率的方法。
步骤
缩小图片32 * 32是一个较好的大小这样方便DCT计算转化为灰度图把缩放后的图片转化为灰度图。计算DCT:DCT把图片分离成分率的集合缩小DCTDCT计算后的矩阵是32 * 32保留左上角的8 * 8这些代表图片的最低频率。计算平均值计算缩小DCT后的所有像素点的平均值。进一步减小DCT大于平均值记录为1反之记录为0.得到信息指纹组合64个信息位顺序随意保持一致性。最后比对两张图片的指纹获得汉明距离即可。
代码实现均值哈希算法和差值哈希算法
import cv2
import numpy as np#均值哈希算法
def aHash(img):#缩放为8*8imgcv2.resize(img,(8,8),interpolationcv2.INTER_CUBIC)#转换为灰度图graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#s为像素和初值为0hash_str为hash值初值为s0hash_str#遍历累加求像素和for i in range(8):for j in range(8):ssgray[i,j]#求平均灰度avgs/64#灰度大于平均值为1相反为0生成图片的hash值for i in range(8):for j in range(8):if gray[i,j]avg:hash_strhash_str1else:hash_strhash_str0 return hash_str#差值感知算法
def dHash(img):#缩放8*9imgcv2.resize(img,(9,8),interpolationcv2.INTER_CUBIC)#转换灰度图graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)hash_str#每行前一个像素大于后一个像素为1相反为0生成哈希for i in range(8):for j in range(8):if gray[i,j]gray[i,j1]:hash_strhash_str1else:hash_strhash_str0return hash_str#Hash值对比
def cmpHash(hash1,hash2):n0#hash长度不同则返回-1代表传参出错if len(hash1)!len(hash2):return -1#遍历判断for i in range(len(hash1)):#不相等则n计数1n最终为相似度if hash1[i]!hash2[i]:nn1return nimg1cv2.imread(lenna.png)
img2cv2.imread(lenna_noise.png)
hash1 aHash(img1)
hash2 aHash(img2)
print(hash1)
print(hash2)
ncmpHash(hash1,hash2)
print(均值哈希算法相似度,n)hash1 dHash(img1)
hash2 dHash(img2)
print(hash1)
print(hash2)
ncmpHash(hash1,hash2)
print(差值哈希算法相似度,n)
运行结果
输入 输出
图像相似度比较哈希算法
三种算法的比较 • aHash均值哈希。速度比较快但是常常不太精确。 • pHash感知哈希。精确度较高但是速度方面较差一些。 • dHash差值哈希。精确度较高且速度也非常快。 • 均值哈希本质上是对颜色的比较 • 感知哈希由于做了 DCT 操作本质上是对频率的比较 • 差值哈希本质上是基于渐变的感知哈希算法。