目标:在一个文件夹找出相似度较高的图片,达到以图搜图的目的。

我找了十组,都是高度相似的图片。

核心算法:
1、分别自定义三种计算图片相似度算法,计算图片相似度算法ORB算法,以及局部敏感哈希phash算法,还有传统的直方图计算相似度算法。
2、定义融合相似度阈值为0.85,若三种算法计算出来的相似度最大值大于等于0.85,则取最大值为融合算法之后的相似度。
否则,则取三种算法计算出来的相似度的最小值,作为融合算法的之后的相似度。

3、定义最终相似度较高判断阈值为0.98,若融合之后的相似度值达到0.98,则认为图片非常相似。
4、图片相似的图片复制到一个文件夹下。

下面是具体实现代码。

第一个文件:函数文件 image_similarity_function.py

# -*- encoding=utf-8 -*-# 导入包
import cv2
from functools import reduce
from PIL import Image# 计算两个图片相似度函数ORB算法
def ORB_img_similarity(img1_path,img2_path):""":param img1_path: 图片1路径:param img2_path: 图片2路径:return: 图片相似度"""try:# 读取图片img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)# 初始化ORB检测器orb = cv2.ORB_create()kp1, des1 = orb.detectAndCompute(img1, None)kp2, des2 = orb.detectAndCompute(img2, None)# 提取并计算特征点bf = cv2.BFMatcher(cv2.NORM_HAMMING)# knn筛选结果matches = bf.knnMatch(des1, trainDescriptors=des2, k=2)# 查看最大匹配点数目good = [m for (m, n) in matches if m.distance < 0.75 * n.distance]similary = len(good) / len(matches)return similaryexcept:return '0'# 计算图片的局部哈希值--pHash
def phash(img):""":param img: 图片:return: 返回图片的局部hash值"""img = img.resize((8, 8), Image.ANTIALIAS).convert('L')avg = reduce(lambda x, y: x + y, img.getdata()) / 64.hash_value=reduce(lambda x, y: x | (y[1] << y[0]), enumerate(map(lambda i: 0 if i < avg else 1, img.getdata())), 0)return hash_value#计算两个图片相似度函数局部敏感哈希算法
def phash_img_similarity(img1_path,img2_path):""":param img1_path: 图片1路径:param img2_path: 图片2路径:return: 图片相似度"""# 读取图片img1 = Image.open(img1_path)img2 = Image.open(img2_path)# 计算汉明距离distance = bin(phash(img1) ^ phash(img2)).count('1')similary = 1 - distance / max(len(bin(phash(img1))), len(bin(phash(img2))))return similary# 直方图计算图片相似度算法
def make_regalur_image(img, size=(256, 256)):"""我们有必要把所有的图片都统一到特别的规格,在这里我选择是的256x256的分辨率。"""return img.resize(size).convert('RGB')def hist_similar(lh, rh):assert len(lh) == len(rh)return sum(1 - (0 if l == r else float(abs(l - r))/max(l, r)) for l, r in zip(lh, rh))/len(lh)def calc_similar(li, ri):return sum(hist_similar(l.histogram(), r.histogram()) for l, r in zip(split_image(li), split_image(ri))) / 16.0def calc_similar_by_path(lf, rf):li, ri = make_regalur_image(Image.open(lf)), make_regalur_image(Image.open(rf))return calc_similar(li, ri)def split_image(img, part_size = (64, 64)):w, h = img.sizepw, ph = part_sizeassert w % pw == h % ph == 0return [img.crop((i, j, i+pw, j+ph)).copy() for i in range(0, w, pw) \for j in range(0, h, ph)]

第二个文件 主函数文件:image_similarity_main.py

# -*- encoding=utf-8 -*-from image_similarity_function import *
import os
import shutil# 融合相似度阈值
threshold1=0.85
# 最终相似度较高判断阈值
threshold2=0.98# 融合函数计算图片相似度
def calc_image_similarity(img1_path,img2_path):""":param img1_path: filepath+filename:param img2_path: filepath+filename:return: 图片最终相似度"""similary_ORB=float(ORB_img_similarity(img1_path,img2_path))similary_phash=float(phash_img_similarity(img1_path,img2_path))similary_hist=float(calc_similar_by_path(img1_path, img2_path))# 如果三种算法的相似度最大的那个大于0.85,则相似度取最大,否则,取最小。max_three_similarity=max(similary_ORB,similary_phash,similary_hist)min_three_similarity=min(similary_ORB,similary_phash,similary_hist)if max_three_similarity>threshold1:result=max_three_similarityelse:result=min_three_similarityreturn round(result,3)if __name__ == '__main__':# 搜索图片路径和文件名img1_path='F:/img_spam/data/train/unqrcode/10064003003550210800320010011888.jpg'# 搜索文件夹filepath='F:/img_spam/data/train/unqrcode/'# 相似图片存放路径newfilepath='F:/img_spam/4/第九组/'for parent, dirnames, filenames in os.walk(filepath):for filename in filenames:# print(filepath+filename)img2_path=filepath+filenamekk=calc_image_similarity(img1_path,img2_path)try:if kk>=threshold2:print(img2_path,kk)shutil.copy(img2_path,newfilepath)except Exception as e:# print(e)pass

【python 以图搜图】三种图片相似度计算融合算法相关推荐

  1. python以图搜图_以图搜图(一):Python实现dHash算法(转)

    近期研究了一下以图搜图这个炫酷的东西.百度和谷歌都有提供以图搜图的功能,有兴趣可以找一下.当然,不是很深入.深入的话,得运用到深度学习这货.Python深度学习当然不在话下. 这个功能最核心的东西就是 ...

  2. 以图搜图 - Google 相似图片搜索原理 - Java实现

    转自:http://blog.csdn.net/luohong722/article/details/7100058 前阵子在阮一峰的博客上看到了这篇<相似图片搜索原理>博客,就有一种冲动 ...

  3. 以图搜图算法pytorch,Python以图搜图爬虫

    python可以用图搜图吗 谷歌人工智能写作项目:小发猫 百度图片搜索引擎原理是如何实现的 图片搜索的原理有三个步骤1. 将目标图片进行特征提取,描述图像的算法很多,用的比较多的是:SIFT描述子,指 ...

  4. python以图搜图api_Python深度学习,手把手教你实现「以图搜图」

    随着深度学习的崛起,极大的推动了图像领域的发展,在提取特征这方面而言,神经网络目前有着不可替代的优势.之前文章中我们也介绍了图像检索往往是基于图像的特征比较,看特征匹配的程度有多少,从而检索出相似度高 ...

  5. python以图搜图api_网络图片搜索-以图搜图【最新版】_自动识别接口_图像识别_数据API-云市场-阿里云...

    {"moduleinfo":{"advanList_count":[{"count_phone":4,"count":4 ...

  6. python 以图搜图

    import os import cv2 as cv import numpy as np import pandas as pd import matplotlib.pyplot as plt#读取 ...

  7. 以图搜图(一):python aHash算法

    文章目录 感知哈希算法 实现过程 python代码 缺点 感知哈希算法 以图搜图的关键技术叫做"感知哈希算法"(Perceptual hash algorithm),它的作用是对每 ...

  8. 11款相似图片搜索引擎推荐,以图搜图将不再是难事

    你想凭着一张现有图片找出它的原始图片,或者是凭着一张小的缩略图找出原始大图吗? 下面的十一款搜索引擎可以帮你实现,以图找图,以图搜图,以图片搜索相似的图片. 1.http://tineye.com/ ...

  9. 图像匹配,基于深度学习DenseNet实现以图搜图功能

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 度学习的发展使得在此之前以机器学习为主流算法的相关实现变得简单,而且准确率更高,效果更好,在图 ...

最新文章

  1. 谭浩强《C++程序设计》学习
  2. 通过启动项设置实现应用程序自启动功能
  3. eclipse打开过的工程信息保存路径
  4. java中Infinity(无限)和NaN
  5. C#网络类智能开关控制板实例
  6. Mybatis整合spring
  7. string返回第n个字符_Programming in Lualua学习第13期 Lua字符串库
  8. java renderer_Java TableCellRenderer显示奇怪的行为
  9. 导航 navigationbar 与 tabbar
  10. mysql 有数据更新数据_MySQL之——实现无数据插入,有数据更新
  11. 局域网服务器共享不稳定怎么办,局域网计算机文件共享异常解决方案
  12. 如何画出企业系统架构图
  13. U盘重装Win10系统视频教程
  14. 芯动科技面试——数字IC/FPGA面试案例总结1
  15. MacOS 安装 brew (国内镜像源)
  16. 数据竞赛修炼笔记之快手用户活跃度的预测
  17. 上班,老实人和精明人的区别是什么?
  18. Dynamic CRM(IFD)登陆超时时间查看及修改
  19. 学习手册--没必要装模做样,只有你自己最清楚
  20. 滑动门套滑动门css,JS+CSS实现带小三角指引的滑动门效果

热门文章

  1. 逗号用计算机怎么打,使用电脑如何输入特殊字符符号?这些输入小技巧一看就会...
  2. Linux搭建squid varnish 代理服务器
  3. [编程入门]自定义函数求一元二次方程
  4. 看着窗户外行走的路人,始终看不见你
  5. BufferedWriter的write(int c)方法
  6. 常州SEO姜东:技术搜索引擎优化
  7. c语言找出一个数组中出现次数最多的那个元素,c语言找出数组中出现次数最多地那个元素...
  8. Pycharm如何打断点
  9. 四川师范大学自然地理(2-地壳)90分以上版本
  10. 别开发APP了,这不是在开玩笑