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

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

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

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

python 复制代码
pip install opencv-python numpy Pillow scikit-image

以下是Python代码:

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)  # 复制最相似的图片到指定目录

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

相关推荐
伯明翰java7 小时前
Java接口
java·开发语言
BoBoZz197 小时前
ColorEdges 动态有向图的动态渲染
python·vtk·图形渲染·图形处理
Macbethad7 小时前
Arduino智能硬件开发技术报告
开发语言
彼岸花开了吗7 小时前
构建AI智能体:六十九、Bootstrap采样在大模型评估中的应用:从置信区间到模型稳定性
人工智能·python·llm
echo的PHP开发7 小时前
如何获取苹果手机的 XcodeOrgId
python·智能手机·苹果手机
云和数据.ChenGuang7 小时前
Java装箱与拆箱(面试核心解析)
java·开发语言·面试
程序员杰哥8 小时前
Postman设置接口关联,实现参数化
自动化测试·软件测试·python·测试工具·测试用例·接口测试·postman
Evand J8 小时前
【定位代码】复杂地磁环境下无人机自主导航增强技术研究——地磁匹配与多源数据融合方法,附matlab代码
开发语言·matlab·无人机
沛沛老爹8 小时前
2025年java总结:缝缝补补又一年?
java·开发语言·人工智能·python·guava·总结·web转型ai
威风的虫8 小时前
LlamaIndex中的文档处理核心模块
python