当前位置: 首页 > news >正文

Python使用余弦相似度比较两个图片

为了使用余弦相似度来找到与样例图片相似的图片,我们需要先进行一些预处理,然后计算每两张图片之间的余弦相似度。以下是一个简单的实现:

  1. 读取样例图片和目标文件夹中的所有图片。
  2. 对每张图片进行预处理,例如灰度化、降噪等。
  3. 计算每张图片与样例图片的余弦相似度。
  4. 找到与样例图片最相似的图片并复制到指定目录。

首先,确保你已经安装了必要的库:

pip install opencv-python numpy Pillow scikit-image

以下是Python代码:

import cv2  
import numpy as np  
from skimage import io, img_as_ubyte  
from sklearn.metrics.pairwise import cosine_similarity  
from PIL import Image  
import os  
import shutil  # 图片路径和目标路径  
sample_image_path = "测试图片\\356-1703817660893.jpg"  
image_folder = "未分类图片文件夹"  
output_folder = "输出图片文件夹"  # 读取样例图片  
sample_image = cv2.imread(sample_image_path, cv2.IMREAD_GRAYSCALE)  
sample_image = img_as_ubyte(sample_image)  # 确保图片在0-255范围内  
sample_image = io.imread(sample_image)  # 使用skimage读取,确保是数组格式  # 读取目标文件夹中的所有图片并预处理  
images = []  
for filename in os.listdir(image_folder):  img = cv2.imread(os.path.join(image_folder, filename), cv2.IMREAD_GRAYSCALE)  img = img_as_ubyte(img)  # 确保图片在0-255范围内  img = io.imread(img)  # 使用skimage读取,确保是数组格式  images.append(img)  # 计算余弦相似度并找到最相似的图片  
similarities = []  
for image in images:  similarity = cosine_similarity(sample_image.reshape(-1, 1), image.reshape(-1, 1))[0][0]  similarities.append((similarity, image))  
similarities.sort(key=lambda x: x[0], reverse=True)  # 按相似度排序  
most_similar_image = similarities[0][1]  # 最相似的图片  # 复制最相似的图片到指定目录  
output_filename = os.path.join(output_folder, "most_similar_" + os.path.basename(sample_image_path))  
shutil.copyfile(os.path.join(image_folder, os.path.basename(sample_image_path)), output_filename)  # 复制原样例图片到指定目录  
shutil.copyfile(os.path.join(image_folder, os.path.basename(most_similar_image)), output_filename)  # 复制最相似的图片到指定目录

注意:这个代码假设所有的图片都已经以灰度格式存储,并且大小相同。如果实际情况不是这样,你可能需要进行一些额外的预处理步骤,例如调整大小或转换为灰度。此外,对于大型图片集,计算余弦相似度可能会比较慢,因此你可能需要使用更高效的相似度计算方法或优化代码。

http://www.lryc.cn/news/271486.html

相关文章:

  • 树莓派4B-Python使用PyCharm的SSH协议在电脑上远程编辑程序
  • Servlet的自动加载、ServletConfig对象、ServletContext对象
  • Vue - Class和Style绑定详解
  • 适用于 Windows 的 7 个顶级视频转换器 – 流畅的视频转换体验!
  • Vue3全局属性app.config.globalProperties
  • 单片机开发--keil5
  • <JavaEE> TCP 的通信机制(三) -- 滑动窗口
  • 听GPT 讲Rust源代码--library/portable-simd
  • CMake入门教程【基础篇】CMake+Minggw构建项目
  • 2024年原创深度学习算法项目分享
  • Linux自定义shell编写
  • 堆的应用:堆排序和TOP-K问题
  • element表格排序功能
  • HNU-Java程序设计基础训练-2023
  • 数据库和数据库编程
  • 爬虫基础一(持续更新)
  • 右键菜单“以notepad++打开”,在windows文件管理器中
  • JSON.parseObject强制将自动转化的Intage型设置为Long型
  • Redis的集群模式:主从 哨兵 分片集群
  • Note: An Interesting Festival
  • iview表格固定列横向滚动条无法拖动问题
  • Python序列之集合
  • 智慧园区物联综合管理平台之架构简述
  • 国科大图像处理2023速通期末——汇总2017-2019
  • oracle 9i10g编程艺术-读书笔记2
  • PACC:数据中心网络的主动 CNP 生成方案
  • 我最喜欢的趣味几何书-读书笔记
  • Stable Diffusion模型概述
  • 二叉树详解(深度优先遍历、前序,中序,后序、广度优先遍历、二叉树所有节点的个数、叶节点的个数)
  • C++日期类的实现