Python图片检索之以图搜图


Posted in Python onMay 31, 2021

一、待搜索图

Python图片检索之以图搜图

二、测试集

Python图片检索之以图搜图

三、new_similarity_compare.py

# -*- 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

四、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 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)]

五、结果

Python图片检索之以图搜图

到此这篇关于Python图片检索之以图搜图的文章就介绍到这了,更多相关Python以图搜图内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
May 06 Python
python字典多条件排序方法实例
Jun 30 Python
Python中使用不同编码读写txt文件详解
May 28 Python
基于Python实现一个简单的银行转账操作
Mar 06 Python
Python守护进程和脚本单例运行详解
Jan 06 Python
Python利用pandas计算多个CSV文件数据值的实例
Apr 19 Python
django框架自定义模板标签(template tag)操作示例
Jun 24 Python
详解Python self 参数
Aug 30 Python
PyCharm导入python项目并配置虚拟环境的教程详解
Oct 13 Python
Python3 A*寻路算法实现方式
Dec 24 Python
Python将字典转换为XML的方法
Aug 01 Python
Python项目打包成二进制的方法
Dec 30 Python
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
python中的plt.cm.Paired用法说明
May 31 #Python
在pycharm中无法import所安装的库解决方案
如何在pycharm中快捷安装pip命令(如pygame)
Python 实现绘制子图及子图刻度的变换等问题
python 利用PyAutoGUI快速构建自动化操作脚本
pandas中DataFrame数据合并连接(merge、join、concat)
You might like
PHP网页游戏学习之Xnova(ogame)源码解读(四)
2014/06/23 PHP
使用纯php代码实现页面伪静态的方法
2015/07/25 PHP
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
jQuery动态添加 input type=file的实现代码
2012/06/14 Javascript
JavaScript Scoping and Hoisting 翻译
2012/07/03 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
2014/04/10 Javascript
javascript类型系统 Array对象学习笔记
2016/01/09 Javascript
jQuery点击输入框显示验证码图片
2016/05/19 Javascript
实例讲解JavaScript中instanceof运算符的用法
2016/06/08 Javascript
深究AngularJS之ui-router详解
2017/06/13 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
2018/03/22 Javascript
vue 微信授权登录解决方案
2018/04/10 Javascript
vue动态路由配置及路由传参的方式
2018/05/23 Javascript
js 实现在2d平面上画8的方法
2018/10/10 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
[48:38]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs Secret
2018/03/31 DOTA
简单学习Python多进程Multiprocessing
2017/08/29 Python
深入理解python中sort()与sorted()的区别
2018/08/29 Python
利用arcgis的python读取要素的X,Y方法
2018/12/22 Python
Python设计模式之策略模式实例详解
2019/01/21 Python
用django设置session过期时间的方法解析
2019/08/05 Python
使用tensorflow实现矩阵分解方式
2020/02/07 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
pytorch 计算Parameter和FLOP的操作
2021/03/04 Python
英国高档时尚男装购物网站:MR PORTER
2016/08/09 全球购物
机电一体化职业规划书
2014/01/07 职场文书
应届毕业生个人求职信范文
2014/01/29 职场文书
优秀经理事迹材料
2014/02/01 职场文书
药学专业学生的自我评价分享
2014/02/06 职场文书
婚内分居协议书范文
2014/11/26 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书
Python使用Kubernetes API访问集群
2021/05/30 Python
使用Mysql计算地址的经纬度距离和实时位置信息
2022/04/29 MySQL