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爬虫之抓取百度贴吧代码分享
Nov 06 Python
Python while、for、生成器、列表推导等语句的执行效率测试
Jun 03 Python
使用python实现个性化词云的方法
Jun 16 Python
python实现员工管理系统
Jan 11 Python
win7+Python3.5下scrapy的安装方法
Jul 31 Python
python使用Matplotlib画条形图
Mar 25 Python
selenium 安装与chromedriver安装的方法步骤
Jun 12 Python
用python介绍4种常用的单链表翻转的方法小结
Feb 24 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
Jun 18 Python
Python使用tkinter实现摇骰子小游戏功能的代码
Jul 02 Python
python多线程semaphore实现线程数控制的示例
Aug 10 Python
弄清Pytorch显存的分配机制
Dec 10 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自动生成月历代码
2006/10/09 PHP
一段防盗连的PHP代码
2006/12/06 PHP
php smarty模版引擎中的缓存应用
2009/12/02 PHP
php简单复制文件的方法
2016/05/09 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
2015/10/02 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
功能强大的jquery.validate表单验证插件
2016/11/07 Javascript
详解用node搭建简单的静态资源管理器
2017/08/09 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
小程序分享链接onShareAppMessage的具体用法
2020/05/22 Javascript
微信小程序文章列表功能完整实例
2020/06/03 Javascript
js+css实现全屏侧边栏
2020/06/16 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
python随机生成指定长度密码的方法
2015/04/04 Python
python中split方法用法分析
2015/04/17 Python
Python函数式编程指南(一):函数式编程概述
2015/06/24 Python
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
2018/02/06 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
python pandas生成时间列表
2019/06/29 Python
Python socket非阻塞模块应用示例
2019/09/12 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
python可以用哪些数据库
2020/06/22 Python
Django crontab定时任务模块操作方法解析
2020/09/10 Python
html+js 实现markdown编辑器效果
2019/10/23 HTML / CSS
Ajax和javascript的区别
2013/07/20 面试题
内科护士实习自我鉴定
2013/10/17 职场文书
大学生在校学习的自我评价
2014/02/18 职场文书
大学计划书范文800字
2014/08/14 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书