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异常处理总结
Aug 15 Python
Python读取键盘输入的2种方法
Jun 16 Python
python3中str(字符串)的使用教程
Mar 23 Python
基于Python os模块常用命令介绍
Nov 03 Python
python Celery定时任务的示例
Mar 13 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
对python调用RPC接口的实例详解
Jan 03 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
Sep 11 Python
tensorflow安装成功import tensorflow 出现问题
Apr 16 Python
Python pytesseract验证码识别库用法解析
Jun 29 Python
python利用opencv保存、播放视频
Nov 02 Python
深入理解python协程
Jun 15 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
收音机的保养
2021/03/01 无线电
PHP 5.0对象模型深度探索之对象复制
2008/03/27 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
2013/12/20 PHP
php动态绑定变量的用法
2015/06/16 PHP
php实现处理输入转义字符的代码
2015/11/08 PHP
php读取torrent种子文件内容的方法(测试可用)
2016/05/03 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
基于jquery的超简单上下翻
2010/04/20 Javascript
HTML Dom与Css控制方法
2010/10/25 Javascript
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
Javascript实现飞动广告效果的方法
2015/05/25 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
JQuery自动触发事件的方法
2015/06/13 Javascript
JAVA四种基本排序方法实例总结
2015/07/24 Javascript
把多个JavaScript函数绑定到onload事件处理函数上的方法
2016/09/04 Javascript
基于jQuery实现一个marquee无缝滚动的插件
2017/03/09 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
Node批量爬取头条视频并保存方法
2018/09/20 Javascript
详解Vue、element-ui、axios实现省市区三级联动
2019/05/07 Javascript
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
python Opencv将图片转为字符画
2021/02/19 Python
NumPy排序的实现
2020/01/21 Python
pytorch中图像的数据格式实例
2020/02/11 Python
python logging 日志的级别调整方式
2020/02/21 Python
Python龙贝格法求积分实例
2020/02/29 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
2020/11/24 Python
基于Modernizr 让网站进行优雅降级的分析
2013/04/21 HTML / CSS
香港彩色隐形眼镜在线商店:Stunninglens(全球免费送货)
2019/05/10 全球购物
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
师范生教师实习自我鉴定
2013/09/27 职场文书
电子商务应届生求职信
2013/11/16 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
mysql的单列多值存储实例详解
2022/04/05 MySQL