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 字符串定义
Sep 25 Python
json跨域调用python的方法详解
Jan 11 Python
Python实现读取并保存文件的类
May 11 Python
python实现聚类算法原理
Feb 12 Python
python按修改时间顺序排列文件的实例代码
Jul 25 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
Dec 18 Python
python解析多层json操作示例
Dec 30 Python
matplotlib.pyplot.matshow 矩阵可视化实例
Jun 16 Python
Python 忽略文件名编码的方法
Aug 01 Python
Python爬虫爬取有道实现翻译功能
Nov 27 Python
pytorch 实现在测试的时候启用dropout
May 27 Python
python 进阶学习之python装饰器小结
Sep 04 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
山进SANGEAN ATS-909X电路分析
2021/03/02 无线电
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
各种页面定时跳转(倒计时跳转)代码总结
2013/10/24 Javascript
js获取下拉列表框中的value和text的值示例代码
2014/01/11 Javascript
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
vue-router中的hash和history两种模式的区别
2018/07/17 Javascript
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
2018/07/19 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
2018/08/22 Javascript
node学习笔记之读写文件与开启第一个web服务器操作示例
2019/05/29 Javascript
Python中实现对Timestamp和Datetime及UTC时间之间的转换
2015/04/08 Python
python编程开发之日期操作实例分析
2015/11/13 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
解决python3 urllib中urlopen报错的问题
2017/03/25 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
Django自定义manage命令实例代码
2018/02/11 Python
python实现自动发送报警监控邮件
2018/06/21 Python
Python中dict和set的用法讲解
2019/03/28 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
用Python从0开始实现一个中文拼音输入法的思路详解
2019/07/20 Python
python应用文件读取与登录注册功能
2019/09/23 Python
Python大数据之使用lxml库解析html网页文件示例
2019/11/16 Python
python 项目目录结构设置
2020/02/14 Python
如何在django中运行scrapy框架
2020/04/22 Python
Python常用数据分析模块原理解析
2020/07/20 Python
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
网络技术支持面试题
2013/04/22 面试题
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
财政局个人总结
2015/03/04 职场文书
2015年妇联工作总结范文
2015/04/22 职场文书
飞越疯人院观后感
2015/06/09 职场文书
《语言的突破》读后感3篇
2019/12/12 职场文书
Java 中的 Lambda List 转 Map 的多种方法详解
2022/07/07 Java/Android