怎样用python实现图片搜索图片功能?
Admin 2021-08-25 群英技术资讯 1307 次浏览
怎样用python实现图片搜索图片功能?一些朋友比较好奇图搜图功能是怎样实现,因此这篇文章就主要给大家分享用python实现图片搜索图片功能,感兴趣的朋友可以参考。
# -*- encoding=utf-8 -*- from image_similarity_function import * import os import shutil # 融合相似度阈值 threshold1 = 0.70 # 最终相似度较高判断阈值 threshold2 = 0.95 # 融合函数计算图片相似度 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.7,则相似度取最大,否则,取最小。 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_similarity else: result = min_three_similarity return round(result, 3) if __name__ == '__main__': # 搜索文件夹 filepath = r'D:\Dataset\cityscapes\leftImg8bit\val\frankfurt' #待查找文件夹 searchpath = r'C:\Users\Administrator\Desktop\cityscapes_paper' # 相似图片存放路径 newfilepath = r'C:\Users\Administrator\Desktop\result' for parent, dirnames, filenames in os.walk(searchpath): for srcfilename in filenames: img1_path = searchpath +"\\"+ srcfilename for parent, dirnames, filenames in os.walk(filepath): for i, filename in enumerate(filenames): print("{}/{}: {} , {} ".format(i+1, len(filenames), srcfilename,filename)) img2_path = filepath + "\\" + filename # 比较 kk = calc_image_similarity(img1_path, img2_path) try: if kk >= threshold2: # 将两张照片同时拷贝到指定目录 shutil.copy(img2_path, os.path.join(newfilepath, srcfilename[:-4] + "_" + filename)) except Exception as e: # print(e) pass
# -*- 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 similary except: 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(img1)))) 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.0 def 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.size pw, ph = part_size assert w % pw == h % ph == 0 return [img.crop((i, j, i + pw, j + ph)).copy() for i in range(0, w, pw) \ for j in range(0, h, ph)]
关于pythons实现图片搜索图片的功能就介绍到这,上述代码具有一定的参考价值,感兴趣的朋友可以借鉴,希望能对大家有帮助,想要了解更多python实现搜索图片的功能,大家可以关注其他文章。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
python列表的增删操作怎样实现?对列表做增删操作是比较常见的需求,也是很基础的内容,对此这篇文章就给大家分享一些python列表的增删操作的实例,感兴趣的朋友可以参考。
日常工作中有许多类型的文件,以及许多方法,用它们从文件中提取数据来图形化。本文将利用Python实现从文件中加载数据,感兴趣的可以了解一下
这篇文章主要介绍了python如何获取当前系统的日期,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
这篇文章主要介绍了Python如何匹配文本并在其上一行追加文本,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
这篇文章主要介绍了python数据结构中的数据类型,在 Python 以及其他所有面向对象编程语言中,类都是对数据的构成(状态)以及数据 能做什么(行为)的描述,下面我们就来你看看python数据结构中的数据类型商务详细介绍,需要的小伙伴可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008