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基于queue和threading实现多线程下载实例
Oct 08 Python
详解Python中for循环的使用
Apr 14 Python
python获取一组汉字拼音首字母的方法
Jul 01 Python
python创建临时文件夹的方法
Jul 06 Python
python多进程共享变量
Apr 06 Python
详解Python中heapq模块的用法
Jun 28 Python
python 获取字符串MD5值方法
May 29 Python
python3 拼接字符串的7种方法
Sep 12 Python
Python 脚本获取ES 存储容量的实例
Dec 27 Python
python编写softmax函数、交叉熵函数实例
Jun 11 Python
Python 实现集合Set的示例
Dec 21 Python
Python如何识别银行卡卡号?
Jun 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,ajax实现分页
2008/03/27 PHP
由php的call_user_func传reference引发的思考
2010/07/23 PHP
PHP MemCached高级缓存配置图文教程
2010/08/05 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
2016/11/15 PHP
tp5框架内使用tp3.2分页的方法分析
2019/05/05 PHP
JS在IE和FF下attachEvent,addEventListener学习笔记
2009/11/26 Javascript
在chrome中window.onload事件的一些问题
2010/03/01 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
jQuery实现可以控制图片旋转角度效果(附demo源码下载)
2016/01/27 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
Javascript函数中的arguments.callee用法实例分析
2016/09/16 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
jQuery Ajax实现跨域请求
2017/01/21 Javascript
JS实现css hover操作的方法示例
2017/04/07 Javascript
angularjs实现搜索的关键字在正文中高亮出来
2017/06/13 Javascript
详解自定义ajax支持跨域组件封装
2018/02/08 Javascript
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
Python发送Email方法实例
2014/08/21 Python
python获取当前日期和时间的方法
2015/04/30 Python
Python2实现的图片文本识别功能详解
2018/07/11 Python
Flask框架Flask-Principal基本用法实例分析
2018/07/23 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)
2018/07/12 HTML / CSS
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
Shopee越南:东南亚与台湾电商平台
2019/02/03 全球购物
如何查找网页漏洞
2016/06/22 面试题
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
2013/02/17 面试题
出国留学自荐信
2013/10/25 职场文书
总经理秘书的岗位职责
2013/12/27 职场文书
2019暑假学生安全口号
2019/06/27 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
利用Sharding-Jdbc进行分库分表的操作代码
2022/01/22 Java/Android