我使用感知哈希算法对多张图片进行了测试,以上链接中提到差值哈希的速度更快、准确度更高,因此直接用的差值哈希(dhash),但是并未有很好的效果。感知哈希对图片进行缩放,提取特征,不考虑过多的局部特征,可能这也是它不够准确的原因吧。考虑寻找其他方法。

我尝试将汉明距离为6及以下的认为是相似图片,相似的图片基本上能找到,但是还有一些不同的图片也会被认为相似,设置汉明距离为5时,相似的图片也不再能找到。

贴出代码,代码参考上述链接。

import os
import numpy as np
import cv2class XHash:'''感知 Hash 算法'''def __init__(self, image_path, hash_type):self.image_path = image_pathself.hash_size = 8self.type = hash_typeif self.type == 'aHash':self.hash = self.__aHash()elif self.type == 'dHash':self.hash = self.__dHash()def __get_gray(self, img):'''读取 RGB 图片 并转换为灰度图'''# 由于 cv2.imread 无法识别中文路径,所以使用 plt.imreadreturn cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换为灰度图def __difference(self):'''比较左右像素的差异'''#img = plt.imread(self.image_path)img = cv2.imdecode(np.fromfile(self.image_path,dtype=np.uint8),cv2.IMREAD_COLOR) # 解决无法取得中文路径问题resize_img = cv2.resize(img, (self.hash_size+1, self.hash_size))gray = self.__get_gray(resize_img)  # 灰度化# 计算差异differences = []for t in range(resize_img.shape[1] - 1):differences.append(gray[:, t] > gray[:, t + 1])return np.stack(differences).Tdef __average(self):'''与像素均值进行比较'''#img = plt.imread(self.image_path)img = cv2.imdecode(np.fromfile(self.image_path,dtype=np.uint8),cv2.IMREAD_COLOR)resize_img = cv2.resize(img, (self.hash_size, self.hash_size))gray = self.__get_gray(resize_img)return gray > gray.mean()def __binarization(self, hash_image):'''二值化'''return ''.join(hash_image.astype('B').flatten().astype('U').tolist())def __seg(self, hash_image):img_bi = self.__binarization(hash_image)return list(map(lambda x: '%x' % int(img_bi[x:x + 4], 2), range(0, 64, 4)))def __aHash(self):return self.__seg(self.__average())def __dHash(self):return self.__seg(self.__difference())class Pairs:'''使用 dHash 实现哈希感知算法'''def __init__(self, root):if root == None:root = os.getcwd()  # 当前工作目录self.pairs = []self.names = {j: os.path.join(root, name)for j, name in enumerate(os.listdir(root))}  # {"序号":文件名,...}#print(self.names)self.__hashs = np.array([XHash(self.names[name], 'dHash').hashfor name in self.names.keys()])  # XHash(imgPath, 'dhash').hash#print(self.__hashs)  [[md5][][]]self.__cal_haming_distance(self.__hashs)self.get_names()def __cal_haming_distance(self, hashs):'''计算两两之间的距离'''j = 0pairs = {}print('hashs=', hashs)print(hashs.shape[0])while j < hashs.shape[0]:for i in range(j + 1, hashs.shape[0]):  # 图片对,过滤到已经计算过的 pairs#print(np.array(hashs[i] != hashs[j]))#print('hash[i]={},hash[j]={}'.format(hashs[i], hashs[j]))pairs[j] = pairs.get(j, []) + [np.array(hashs[i] != hashs[j]).sum()]  # True,S Falsecontinueprint('pairs=', pairs)j += 1self.pairs = pairsdef get_names(self):n = len(self.pairs)temp = {}while n > 0:n -= 1print(self.pairs[n])for i, d in enumerate(self.pairs[n]):#if d == 0:if d <= 5: temp[n] = temp.get(n, []) + [i + n + 1]continueprint('temp=', temp)return tempdef del_repeat(self):P = self.get_names()for j in P:for i in P[j]:try:os.remove(self.names[i])except FileNotFoundError:print('已经移除,无需再次移除!')print('删除完成!')pairs = Pairs(yourPath)print(pairs.get_names())

尝试了 aircv 的匹配,区分图像的正确率要比感知哈希高出很多,当然,细微部分还是区分不出,不过我在测试区分图像时主要区分的是带文字的图像,aircv 只是在个别字不同时分辨不出两张图像不同,私以为能准确到如此地步,已经很不错了。

用md5值识别相似图片 python相关推荐

  1. 贴吧图片是否需要修改md5值,批量修改图片md5值-批量修改图片md5工具

    答:不需要,只要说图片修改md5值去发就行的,无论是不是大佬,全都是low笔.[谁问谁low笔] 我是万能的小胡,专注研究防删图,带您轻松玩转贴吧

  2. python 利用 PIL 将数组值转成图片/python利用h5py、pyhdf读取.h5、.hdf文件信息

    python 利用 PIL 将数组值转成图片 安装 PIL 包 pip install pillow 将二维数据转换成单通道图片 from PIL import Image arr=numpy.asa ...

  3. 计算文件的md5;vue计算文件md5值;计算图片的md5值;

    github链接 1.先下载 npm i browser-md5-file -S 2.在使用的vue页面引入和声明方法 import BMF from 'browser-md5-file' const ...

  4. python计算文件md5值_用python计算文件的MD5值

    md5是一种常见不可逆加密算法,使用简单,计算速度快,在很多场景下都会用到,比如:给用户上传的文件命名,数据库中保存的用户密码,下载文件后检验文件是否正确等.下面讲解在python中如何使用md5算法 ...

  5. 对比两张图片的MD5值

    图片上传的时候,通过对比两张图片的MD5值,判断图片是否上传成功. package com.kedacom.testdemo.javaTest;import java.io.File; import ...

  6. Python图片添加水印修改MD5值

    Python图片添加水印修改MD5值 效果图 安装pillow(python图形界面库) 生成水印 查看MD5值 效果图 安装pillow(python图形界面库) pip install pillo ...

  7. Python 计算MD5值 图片查重去重

    MD5 MD5 即 Message-Digest Algorithm 5(信息-摘要算法5).摘要算法又称哈希算法.散列算法. 它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进 ...

  8. 利用python进行识别相似图片(二)

    前言 和网上各种首先你要有一个女朋友的系列一样,想进行人脸判断,首先要有脸, 只要能靠确定人脸的位置,那么进行两张人脸是否相似的操作便迎刃而解了. 所以本篇文章着重讲述如何利用openCV定位人脸. ...

  9. python简单图片识别_用Python进行简单的图片识别(1)

    起因是这样的,我想买一个定焦镜头,但也不是必需品,可以长期观望购买.最初的想法是,写个程序,每天爬一下各大电商网站的价格,或者直接爬etao把该镜头的价格记录下来,突然有一个惊爆的低价,就发邮件通知. ...

  10. Python-计算md5值对图片去重

    MD5简介 MD5 即 Message-Digest Algorithm 5(信息-摘要算法5).摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16 ...

最新文章

  1. 早就听闻阿里开源的 Arthas 在做 Java 应用诊断上十分牛逼,没失望
  2. 学Android开发 这19个开发工具助你顺风顺水
  3. php接受post值报错,php接收post参数时报错怎么办
  4. Git clone时出现Please make sure you have the correct access rights and the repository exists.问题已解决。...
  5. Java集合框架:LinkedHashMap
  6. ai创造了哪些职业_关于创造职业的思考
  7. asp与php对比,个人看法 zblogasp和zblogphp的对比
  8. Oozie 调用sqoop导数据出现NoClassDefFoundError问题
  9. Mongo数据库慢查询功能
  10. 新安装的centos使用ifconfig无效或者无法使用的解决办法
  11. (转)Please ensure Intel HAXM is properly installed and usable. 解决方案
  12. React15中的栈调和diff算法
  13. vb用计算机解决鸡兔同笼,vb解决鸡兔同笼问题
  14. 【最优化导论】一维搜索方法
  15. Excel不够用,快试试这款企业报表工具
  16. python 如何调试uc浏览器_Python爬虫教程-10-UserAgent和常见浏览器UA值
  17. 读书笔记:如何阅读一本书
  18. 公司开除并在离职证明上贬低被程序员怒怼,网友:总有耿直的员工
  19. 《QT+PCL第七章》点云分割-CPC
  20. python中的运算表达式规则

热门文章

  1. 用php做动态时钟,vue实现动态时钟以及日期
  2. Python输入若干整数求和
  3. 解决redhat vmware安装后鼠标不能使用问题
  4. Python自动化模拟键盘操作
  5. UVA - 11729 Commando War
  6. 第一次申请赴美商务签经历
  7. 怎么把音频转换成mp3格式?
  8. 领导力教练:世界著名企业教练们的实践心得(原书第3版)
  9. 顺序结构—— 华氏温度转摄氏温度
  10. 【心得感想】谈谈工作效率及沟通