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写的PHPMyAdmin暴力破解工具代码
Aug 06 Python
使用Python编写基于DHT协议的BT资源爬虫
Mar 19 Python
一个可以套路别人的python小程序实例代码
Apr 09 Python
python实现控制COM口的示例
Jul 03 Python
Python基础之高级变量类型实例详解
Jan 03 Python
pycharm 设置项目的根目录教程
Feb 12 Python
Python实现Wordcloud生成词云图的示例
Mar 30 Python
Python调用百度OCR实现图片文字识别的示例代码
Jul 17 Python
python Yaml、Json、Dict之间的转化
Oct 19 Python
详解Python小数据池和代码块缓存机制
Apr 07 Python
解决Django transaction进行事务管理踩过的坑
Apr 24 Python
Python socket如何解析HTTP请求内容
Feb 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简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
深入PHP运行环境配置的详解
2013/06/04 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
php实现mysql数据库分表分段备份
2015/06/18 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
jQuery 事件队列调整方法
2009/09/18 Javascript
统计出现最多的字符次数的js代码
2010/12/03 Javascript
javascript与webservice的通信实现代码
2010/12/25 Javascript
JavaScript中的noscript元素属性位置及作用介绍
2013/04/11 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
javascript ASCII和Hex互转的实现方法
2016/12/27 Javascript
js实现简单的手风琴效果
2017/02/27 Javascript
Angularjs根据json文件动态生成路由状态的实现方法
2017/04/17 Javascript
基于jQuery实现的单行公告活动轮播效果
2017/08/23 jQuery
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
2017/11/09 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
echarts设置图例颜色和地图底色的方法实例
2018/08/01 Javascript
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
vue3弹出层V3Popup实例详解
2021/01/04 Vue.js
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
python解决字典中的值是列表问题的方法
2013/03/04 Python
总结Python编程中三条常用的技巧
2015/05/11 Python
python简单实现计算过期时间的方法
2015/06/09 Python
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
python字典快速保存于读取的方法
2018/03/23 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
PyQt5图形界面播放音乐的实例
2019/06/17 Python
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
基于HTML5的齿轮动画特效
2016/02/29 HTML / CSS
中国宠物用品商城:E宠商城
2016/08/27 全球购物
美国第一个网上卖鞋零售商:OnlineShoes.com
2017/09/24 全球购物
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
赞美老师的演讲稿
2014/05/22 职场文书