用md5值识别相似图片 python
我使用感知哈希算法对多张图片进行了测试,以上链接中提到差值哈希的速度更快、准确度更高,因此直接用的差值哈希(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相关推荐
- 贴吧图片是否需要修改md5值,批量修改图片md5值-批量修改图片md5工具
答:不需要,只要说图片修改md5值去发就行的,无论是不是大佬,全都是low笔.[谁问谁low笔] 我是万能的小胡,专注研究防删图,带您轻松玩转贴吧
- python 利用 PIL 将数组值转成图片/python利用h5py、pyhdf读取.h5、.hdf文件信息
python 利用 PIL 将数组值转成图片 安装 PIL 包 pip install pillow 将二维数据转换成单通道图片 from PIL import Image arr=numpy.asa ...
- 计算文件的md5;vue计算文件md5值;计算图片的md5值;
github链接 1.先下载 npm i browser-md5-file -S 2.在使用的vue页面引入和声明方法 import BMF from 'browser-md5-file' const ...
- python计算文件md5值_用python计算文件的MD5值
md5是一种常见不可逆加密算法,使用简单,计算速度快,在很多场景下都会用到,比如:给用户上传的文件命名,数据库中保存的用户密码,下载文件后检验文件是否正确等.下面讲解在python中如何使用md5算法 ...
- 对比两张图片的MD5值
图片上传的时候,通过对比两张图片的MD5值,判断图片是否上传成功. package com.kedacom.testdemo.javaTest;import java.io.File; import ...
- Python图片添加水印修改MD5值
Python图片添加水印修改MD5值 效果图 安装pillow(python图形界面库) 生成水印 查看MD5值 效果图 安装pillow(python图形界面库) pip install pillo ...
- Python 计算MD5值 图片查重去重
MD5 MD5 即 Message-Digest Algorithm 5(信息-摘要算法5).摘要算法又称哈希算法.散列算法. 它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进 ...
- 利用python进行识别相似图片(二)
前言 和网上各种首先你要有一个女朋友的系列一样,想进行人脸判断,首先要有脸, 只要能靠确定人脸的位置,那么进行两张人脸是否相似的操作便迎刃而解了. 所以本篇文章着重讲述如何利用openCV定位人脸. ...
- python简单图片识别_用Python进行简单的图片识别(1)
起因是这样的,我想买一个定焦镜头,但也不是必需品,可以长期观望购买.最初的想法是,写个程序,每天爬一下各大电商网站的价格,或者直接爬etao把该镜头的价格记录下来,突然有一个惊爆的低价,就发邮件通知. ...
- Python-计算md5值对图片去重
MD5简介 MD5 即 Message-Digest Algorithm 5(信息-摘要算法5).摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16 ...
最新文章
- 早就听闻阿里开源的 Arthas 在做 Java 应用诊断上十分牛逼,没失望
- 学Android开发 这19个开发工具助你顺风顺水
- php接受post值报错,php接收post参数时报错怎么办
- Git clone时出现Please make sure you have the correct access rights and the repository exists.问题已解决。...
- Java集合框架:LinkedHashMap
- ai创造了哪些职业_关于创造职业的思考
- asp与php对比,个人看法 zblogasp和zblogphp的对比
- Oozie 调用sqoop导数据出现NoClassDefFoundError问题
- Mongo数据库慢查询功能
- 新安装的centos使用ifconfig无效或者无法使用的解决办法
- (转)Please ensure Intel HAXM is properly installed and usable. 解决方案
- React15中的栈调和diff算法
- vb用计算机解决鸡兔同笼,vb解决鸡兔同笼问题
- 【最优化导论】一维搜索方法
- Excel不够用,快试试这款企业报表工具
- python 如何调试uc浏览器_Python爬虫教程-10-UserAgent和常见浏览器UA值
- 读书笔记:如何阅读一本书
- 公司开除并在离职证明上贬低被程序员怒怼,网友:总有耿直的员工
- 《QT+PCL第七章》点云分割-CPC
- python中的运算表达式规则