构建图像相似度应用教程

是否想要构建自己的图像相似度应用,但又担心自己对深度学习卷积神经网络等知识了解不够?不用担心,本教程将帮助入门,并指导使用基本数学知识编写自己的图像相似度应用。在深入数学和代码之前,想问一个简单的问题。给定两张参考图像和一张测试图像,认为测试图像与哪张参考图像相似?如果认为测试图像与第一张参考图像相似,那么是对的。如果不这么认为,那么让一起用数学和编程的力量来找出答案。“搜索的未来将更多地依赖于图片而非关键词。”——Pinterest首席执行官Ben Silbermann。

图像向量

每张图像都以数字的形式存储在计算机中,一个能够完全描述图像的数字向量被称为图像向量。欧几里得距离:欧几里得距离表示在n维空间中任意两点之间的距离。由于将图像表示为图像向量,它们不过是n维空间中的一个点,将使用欧几里得距离来找到它们之间的距离。直方图:直方图是一种数值的图形显示。将使用所有三张图像的图像向量,然后找到它们之间的欧几里得距离。基于返回的值,距离较小的图像与另一张图像更为相似。

图像相似度的计算方法

为了找到两张图像之间的相似度,将使用以下方法:读取图像文件作为数组。由于图像文件是彩色的,因此有RGB值的3个通道。将它们展平,使得每张图像是一个单一的1维数组。一旦有了图像文件作为数组,将为每张图像生成一个直方图,其中对于每个索引0-255,将计算该像素值在图像中的出现次数。一旦有了直方图,将使用L2范数或欧几里得距离来找到两个直方图之间的差异。基于测试图像与参考图像的直方图之间的距离,可以找到测试图像最相似的图像。

Python中图像相似度的编码

导入将要使用的依赖项:from PIL import Image from collections import Counter import numpy as np将使用NumPy来存储图像作为NumPy数组,Image来读取图像的数值,Counter来计算每个像素值(0-255)在图像中出现的次数。

读取图像

可以看到图像已经被成功地读取为一个3维数组。在下一步中,需要将这个3维数组展平为一个1维数组。flat_array_1 = array1.flatten() print(np.shape(flat_array_1)) >>> (245760, )将对其他两张图像执行相同的步骤。将在这里跳过这一步,以便也可以亲自尝试。

生成计数-直方图-向量:

RH1 = Counter(flat_array_1) 以下代码行返回一个字典,其中键对应于像素值,键的值是该像素在图像中出现的次数。欧几里得距离的一个限制是它要求所有向量都被归一化,即两个向量需要具有相同的维度。为了确保直方图向量被归一化,将使用一个从0-255的for循环,并生成直方图,如果键在图像中存在,则使用键的值,否则追加一个0。

归一化直方图向量

H1 = [] for i in range(256): if i in RH1.keys(): H1.append(RH1[i]) else: H1.append(0) 上述代码生成了一个大小为(256, )的向量,其中每个索引对应于像素值,值对应于该像素在图像中的计数。对其他两张图像执行相同的步骤,并获取它们对应的计数-直方图-向量。此时,已经得到了两张参考图像和测试图像的最终向量,所需要做的就是计算距离并预测。

欧几里得距离函数:

def L2Norm(H1,H2): distance =0 for i in range(len(H1)): distance += np.square(H1[i]-H2[i]) return np.sqrt(distance) 上述函数接受两个直方图并返回它们之间的欧几里得距离。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485