# -*- coding: utf-8 -*-
import cv2,os
import time
import numpy as np
from matplotlib import pyplot as plt # 输入灰度图,返回hash
def getHash(image): avreage = np.mean(image) hash = [] for i in range(image.shape[0]): for j in range(image.shape[1]): if image[i,j] > avreage: hash.append(1) else: hash.append(0) return hash# 计算汉明距离
def Hamming_distance(hash1,hash2): num = 0for index in range(len(hash1)): if hash1[index] != hash2[index]: num += 1return num# 平均哈希算法计算
def classify_aHash(image1,image2): image1 = cv2.resize(image1,(8,8)) image2 = cv2.resize(image2,(8,8)) gray1 = cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY) hash1 = getHash(gray1) hash2 = getHash(gray2) return Hamming_distance(hash1,hash2) # 感知哈希算法计算
def classify_pHash(image1,image2): image1 = cv2.resize(image1,(32,32)) image2 = cv2.resize(image2,(32,32)) gray1 = cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY) # 将灰度图转为浮点型,再进行dct变换 dct1 = cv2.dct(np.float32(gray1)) dct2 = cv2.dct(np.float32(gray2)) # 取左上角的8*8,这些代表图片的最低频率 # 这个操作等价于c++中利用opencv实现的掩码操作 # 在python中进行掩码操作,可以直接这样取出图像矩阵的某一部分 dct1_roi = dct1[0:8,0:8] dct2_roi = dct2[0:8,0:8] hash1 = getHash(dct1_roi) hash2 = getHash(dct2_roi) return Hamming_distance(hash1,hash2) #差值感知算法
def classify_dHash(image1,image2):#缩放8*8image1=cv2.resize(image1,(9,8),interpolation=cv2.INTER_CUBIC)image2=cv2.resize(image2,(9,8),interpolation=cv2.INTER_CUBIC)#转换灰度图gray1 = cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY) hash_str1=''hash_str2=''#每行前一个像素大于后一个像素为1,相反为0,生成哈希for i in range(8):for j in range(8):if gray2[i,j]>gray2[i,j+1]:hash_str2=hash_str2+'1'else:hash_str2=hash_str2+'0'if gray1[i,j]>gray1[i,j+1]:hash_str1=hash_str1+'1'else:hash_str1=hash_str1+'0'return Hamming_distance(hash_str1,hash_str2)# 最简单的以灰度直方图作为相似比较的实现
def classify_gray_hist(image1,image2,size = (256,256)): # 先计算直方图 # 几个参数必须用方括号括起来 # 这里直接用灰度图计算直方图,所以是使用第一个通道, # 也可以进行通道分离后,得到多个通道的直方图 # bins 取为16 image1 = cv2.resize(image1,size) image2 = cv2.resize(image2,size) hist1 = cv2.calcHist([image1],[0],None,[256],[0.0,255.0]) hist2 = cv2.calcHist([image2],[0],None,[256],[0.0,255.0]) # 可以比较下直方图
#     plt.plot(range(256),hist1,'r')
#     plt.plot(range(256),hist2,'b')
#     plt.show() # 比较直方图的重合度 degree = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)#越大越相似return degreedef GetImgNameByEveryDir(file_dir,videoProperty):  # Input   Root Dir and get all img in per Dir.# Out     Every img with its filename and its dir and its path  FileNameWithPath = [] FileName         = []FileDir          = []for root, dirs, files in os.walk(file_dir):  for file in files:  if os.path.splitext(file)[1] in videoProperty:  FileNameWithPath.append(os.path.join(root, file))  # 保存图片路径FileName.append(file)                              # 保存图片名称FileDir.append(root[len(file_dir):])               # 保存图片所在文件夹return FileName,FileNameWithPath,FileDirdef compare_img(img1_path,img2_path,show):img1 = cv2.imread(img1_path)
#     cv2.imshow('img1',img1) img2 = cv2.imread(img2_path)
#     cv2.imshow('img2',img2)
#最简单的以灰度直方图作为相似比较的实现 degree1 = classify_gray_hist(img1,img2)   if float(degree1*100) > 90:# aHash:平均值哈希。速度比较快,但是常常不太精确。# pHash:感知哈希。精确度比较高,但是速度方面较差一些。# dHash:差异值哈希。Amazing!精确度较高,且速度也非常快。因此我就选择了dHash作为我图片判重的算法。#相似度越小,说明两张图片越相似# 汉明距离小于5 基本相似#平均哈希算法计算 degree2 = classify_aHash(img1,img2) # 感知哈希算法计算 degree3 = classify_pHash(img1,img2) # 差值哈希算法计算 degree4 = classify_dHash(img1,img2)if show:print('\n'+img1_path+"  "+img2_path)print("直方图:%.3f%s,平均哈希:%s,感知哈希:%s,差值哈希:%s"%(degree1*100,'%',degree2,degree3,degree4))if degree2 <= 20 and degree3 <= 20 and degree4 <= 20:avd=((1-(degree2+degree3+degree4)/60)*0.2+degree1*0.8)if avd*100 > 94:if show:print("这两张图相似!")else:print('\n'+img1_path+"  "+img2_path)print("直方图:%.3f%s,平均哈希:%s,感知哈希:%s,差值哈希:%s,直方图与哈希结合概率:%.3f%s"%(degree1*100,'%',degree2,degree3,degree4,avd*100,'%'))print("这两张图相似!")return 1#纵向 vstack#横向 concatenate#         img1 = cv2.resize(img1, (1080, 480), interpolation=cv2.INTER_LINEAR)#         img2 = cv2.resize(img2, (1080, 480), interpolation=cv2.INTER_LINEAR)# #         image = np.concatenate([img1, img2], axis=1) #         image = np.vstack([img1, img2])#         cv2.imshow(img1_path+"  "+img2_path, image)#         k = cv2.waitKey(0) & 0xff#         if k == 27:#             cv2.destroyAllWindows()else:return 0else:return 0if __name__ == '__main__':start =time.process_time()img_1_path='D:\img.jpg'img_2_path='D:\img2.jpg'dele=compare_img(img_1_path,img_2_path,show=0)if dele:os.remove(FileNameWithPath[j])print('%s与%s文件相似度高,删除文件%s\n'%(img_1_path,img_2_path,img_2_path))     end = time.process_time()print('Running time: %.3f Seconds'%(end-start))

python简单图片对比相关推荐

  1. python找图片不同_用openCV和Python 实现图片对比,并标识出不同点的方式

    最近项目中需要实现两组图片对比,并能将两者的区别标识出来. 在网上搜索一大堆找到一篇大神的文章,最终实现该功能,在这里记录下: 想要实现此demo,首先我们得确保电脑上已安装 openCV 和 Pyt ...

  2. 用openCV 和 Python 实现图片对比,并标识出不同点

    最近项目中需要实现两组图片对比,并能将两者的区别标识出来. 在网上搜索一大堆找到一篇大神的文章,最终实现该功能,在这里记录下: 想要实现此demo,首先我们得确保电脑上已安装 openCV 和 Pyt ...

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

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

  4. Python简单图片爬虫

    经常在逛知乎,有时候希望把一些问题的图片集中保存起来.于是就有了这个程序.这是一个非常简单的图片爬虫程序,只能爬取已经刷出来的部分的图片.由于对这一部分内容不太熟悉,所以只是简单说几句然后记录代码,不 ...

  5. Python实现图片对比

    以下内容转载自大牛该大牛,链接点击跳转 具体实现逻辑:使用第三方的控件,将两张图片进行对比,两张图片的尺寸必须一致.然后才能对比. # USAGE # python image_diff.py --f ...

  6. python图片比对、自动化测试_基于python+appium通过图片对比来做的UI自动化

    1.python + appium +图片对比实现UI自动化: 背景: 当手机需要适配不同的语言时,测试过程中易出现因为语言不熟悉,导致UIbug被遗漏(例如setting中的描述性文字显示不完整等等 ...

  7. python图像对比_python+PIL实现图片对比(一)

    前提 前阵子报了个班,学了一些android UI自动化相关的东西,于是想到第一家单位在做android手机自动化的时候,有用到图片对比,来确定是否点到指定的页面,遂想在appium+python做U ...

  8. 简单几步用Python实现人脸对比

    简单几步用Python实现人脸对比 说明:这是我暑假应实习单位需求使用百度api编写的一个简单的人脸相似度对比,其间处理了十万左右的照片,主要是为了判断是否为同一人 a.获取百度人脸识别api的api ...

  9. ruby和python简单对比

    先说说题外话,以前很少写blog,最开始有整理过技术文章到QQ空间,后面整理到WORD以及文本里.再后来网上查找资料的之后发现cnblog上面的蛮专业的.我也觉得把资料存放在网络中永远不会丢.所以就出 ...

最新文章

  1. 洛谷 - P1426 - 小鱼会有危险吗 - 模拟
  2. python 多维数组(array)排序
  3. SQLServer安装挂起解决方法
  4. 实现web版用户注册(可以上传头像)
  5. 线性动力学问题(二)
  6. 金融类自定义View(二)--股票分时图
  7. 关于Negative values in data passed to MultinomialNB (input X)报错问题
  8. 请先切换至Wxml Pannel的解决方法
  9. 1条命令解决使用kubeadm安装 kubernetes 从 k8s.gcr.io 拉取镜像失败的问题
  10. 腾讯QQ2004II Beta3火爆下载 可自定义头像
  11. MyBatis入门介绍,凤凰涅槃:从 iBatis 到 MyBatis
  12. 威斯康星大学硕士计算机科学,威斯康星大学麦迪逊分校计算机科学理学硕士研究生申请要求及申请材料要求清单...
  13. Python黑客系列之——控制自己的手机摄像头拍照,并自动发送到邮箱。
  14. tom猫变声原理解析
  15. 中国艺术《无有中无尽藏》孙溟㠭篆刻
  16. bzoj2876: [Noi2012]骑行川藏 :拉格朗日乘数法
  17. 《机器学习》周志华——勘误表
  18. 百度竞价排名曝光_全球塑胶网:百度爱采购模式推广效果怎么样?
  19. Linux Centos7.6下安装zsh、oh-my-zsh、powerlevel10k美化终端
  20. burpsuite靶场系列之客户端漏洞篇 - 跨站脚本(XSS)专题

热门文章

  1. 自动驾驶丨吉利选择Zenuity为其辅助和自动驾驶软件首选供应商
  2. ​ChatGPT 国产平替上线;FTC 阻止微软 690 亿美元收购动视暴雪;PHP 8.2.0 发布|极客头条
  3. iOS和uni-app、unity的融合方案
  4. css如何设置背景图片?background属性添加背景图片
  5. Unity动画系统详解2:如何导入使用外部的动画?
  6. 【JavaEE】Spring AOP (面向切面)详解
  7. 树链剖分——轻重链剖分
  8. 加州所有学校本学年关闭,六百万学生被影响
  9. 部署高效及泛化能力强的Osnet论文解读
  10. 区块链落地应用盘点:五大领域应用告诉你“区块链能做什么”