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模块restful使用方法实例
Dec 10 Python
python学习入门细节知识点
Mar 29 Python
Python实现自定义顺序、排列写入数据到Excel的方法
Apr 23 Python
python 顺时针打印矩阵的超简洁代码
Nov 14 Python
Django框架序列化与反序列化操作详解
Nov 01 Python
使用 Supervisor 监控 Python3 进程方式
Dec 05 Python
django在开发中取消外键约束的实现
May 20 Python
python中如何进行连乘计算
May 28 Python
Python命名空间及作用域原理实例解析
Aug 12 Python
详解Python 函数参数的拆解
Sep 02 Python
Python实现自动整理文件的脚本
Dec 17 Python
微信小程序调用python模型
Apr 21 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
第八节 访问方式 [8]
2006/10/09 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
php无限极分类实现的两种解决方法
2013/04/28 PHP
php分页函数完整实例代码
2014/09/22 PHP
PHP使用array_fill定义多维数组的方法
2015/03/18 PHP
PHP 前加at符合@的作用解析
2015/07/31 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
jQuery select控制插件
2009/08/17 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
jQuery EasyUI API 中文文档 - Panel面板
2011/09/30 Javascript
Js四则运算函数代码
2012/07/21 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
2014/01/26 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
JS 设置Cookie 有效期 检测cookie
2017/06/15 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
2019/02/01 Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
2019/02/02 Javascript
jQuery 筛选器简单操作示例
2019/10/02 jQuery
JS中的const命令你真懂它吗
2020/03/08 Javascript
Python生成不重复随机值的方法
2015/05/11 Python
Python_LDA实现方法详解
2017/10/25 Python
Windows下python3.6.4安装教程
2018/07/31 Python
Python实现随机生成任意数量车牌号
2020/01/21 Python
python 监控服务器是否有人远程登录(详细思路+代码)
2020/12/18 Python
DogBuddy荷兰:找到你最完美的狗保姆
2019/04/17 全球购物
PHP如何调用MYSQL存储过程
2014/05/30 面试题
班主任经验交流会主持词
2014/04/01 职场文书
大学社团活动总结
2014/04/26 职场文书
党小组鉴定意见
2015/06/02 职场文书
CentOS7设置ssh服务以及端口修改方式
2022/12/24 Servers