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调用windows api锁定计算机示例
Apr 17 Python
Python和GO语言实现的消息摘要算法示例
Mar 10 Python
django站点管理详解
Dec 12 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
Jan 10 Python
详解python编译器和解释器的区别
Jun 24 Python
Python判断字符串是否xx开始或结尾的示例
Aug 08 Python
Python 矩阵转置的几种方法小结
Dec 02 Python
使用Keras实现Tensor的相乘和相加代码
Jun 18 Python
python opencv pytesseract 验证码识别的实现
Aug 28 Python
Python类绑定方法及非绑定方法实例解析
Oct 09 Python
Python实现石头剪刀布游戏
Jan 20 Python
Django如何创作一个简单的最小程序
May 12 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生成文件
2007/01/15 PHP
php面向对象 字段的声明与使用
2012/06/14 PHP
php版本的cron定时任务执行器使用实例
2014/08/19 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
php+mysql实现的二级联动菜单效果详解
2016/05/10 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
2019/10/18 PHP
js的闭包的一个示例说明
2008/11/18 Javascript
HTML复选框和单选框 checkbox和radio事件介绍
2012/12/12 Javascript
jquery ztree实现下拉树形框使用到了json数据
2014/05/14 Javascript
js常用系统函数用法实例分析
2015/01/12 Javascript
简单学习JavaScript中的for语句循环结构
2015/11/10 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
微信小程序 SocketIO 实例讲解
2016/10/13 Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
express启用https使用小记
2019/05/21 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
[46:53]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python爬取内容存入Excel实例
2019/02/20 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
2020/03/16 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
python 写一个水果忍者游戏
2021/01/13 Python
CSS3模拟IOS滑动开关效果
2016/09/28 HTML / CSS
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
运动会跳远加油稿
2014/02/20 职场文书
对孩子的寄语
2014/04/09 职场文书
对外汉语专业大学生职业生涯规划范文
2014/09/13 职场文书
领导班子对照检查材料
2014/09/22 职场文书
2014年司法所工作总结
2014/11/22 职场文书
公司辞职信模板
2015/05/13 职场文书
Nginx设置HTTPS的方法步骤 443证书配置方法
2022/03/21 Servers
Spring Boot实现文件上传下载
2022/08/14 Java/Android