图片相似度识别:dHash算法
2021-03-23 20:44
148 查看
1
dHash算法
aHash中文叫差异哈希算法,在对图片进行哈希转换时,通过左右两个像素大小的比较,得到最终哈希序列。
基本原理:
缩小尺寸。将图片缩小为9*8大小,此时照片有72个像素点。
灰度化处理。
计算差异值,获得最后哈希值(与aHash主要区别处)。比较每行左右两个像素,如果左边的像素比右边的更亮(左边像素值大于右边像素值),则记录为1,否则为0。因为每行有9个像素,左右两个依次比较可得出8个值,所以8行像素共可以得出64个值,因此此时哈希值为长度是64的0-1序列。
图片配对,计算汉明距离。
2
Python实现
本例中依然计算以下两张图片的相似度:
(image1)
(image2)
完整算法
from PIL import Image
import os
import numpy as np
import time
#差异哈希算法
def dHash(image):
image_new=image
#计算均值
avreage = np.mean(image_new)
hash=[]
#每行前一个像素大于后一个像素为1,相反为0,生成哈希
for i in range(8):
for j in range(8):
if image[i,j]>image[i,j+1]:
hash.append(1)
else:
hash.append(0)
return hash
#计算汉明距离
def Hamming_distance(hash1,hash2):
num = 0
for index in range(len(hash1)):
if hash1[index] != hash2[index]:
num += 1
return num
if __name__ == "__main__":
image1 = Image.open('image1.png')
image2 = Image.open('image2.png')
#缩小尺寸并灰度化
start = time.time()
image1=np.array(image1.resize((9, 8), Image.ANTIALIAS).convert('L'), 'f')
image2=np.array(image2.resize((9, 8), Image.ANTIALIAS).convert('L'), 'f')
hash1 = dHash(image1)
hash2 = dHash(image2)
dist = Hamming_distance(hash1, hash2)
end = time.time()
#将距离转化为相似度
similarity = 1 - dist * 1.0 / 64
print('dist is '+'%d' % dist)
print('similarity is ' +'%d' % similarity)
print('time is '+ '%f'%(end-start))
最终结果:
可见两张图片相似度非常低。
相关文章推荐
- 图片相似度算法,可识别出缩放,拉伸,亮暗后的同一张图片
- 经典算法1---相似度--模糊查询,查抄袭,语言识别
- 图片识别 中图片压缩和放大算法,最近邻插值,双线性插值
- 图片相似度算法
- java写得图片相似度处理识别技术代码
- 相似图片搜索、算法、识别的原理解析(上)
- DL之LiR&DNN&CNN:利用LiR、DNN、CNN算法对MNIST手写数字图片(csv)识别数据集实现(10)分类预测
- 相似图片搜索、算法、识别的原理解析(下)
- 人工智能,深度学习,用DQN算法,或者更新的增强算法,进行图片识别小游戏?
- 深入学习使用ocr算法识别图片中文字的方法
- 经典算法1---相似度--模糊查询,查抄袭,语言识别
- 图片相似度识别:aHash算法
- javascript图片相似度算法实现 js实现直方图和向量算法
- CV之FC:人脸识别之判断相似度极高的国内外明星根据人工智能算法(AP云)预测判别是否为同一个人
- PK/NN/*/SVM:实现手写数字识别(数据集50000张图片)比较3种算法神经网络、灰度平均值、SVM各自的准确率—Jason niu
- 模式识别hw3-------常见模式识别算法用于人脸图片性别识别
- javascript图片相似度算法实现 js实现直方图和向量算法
- 图片验证码识别算法
- 【matlab】:matlab做的图片关联性识别算法
- 基于KNN算法实现的单个图片数字识别