利用python建立图像相似度
处理图像:处理图片需要执行一种变化,用数字形式呈现图像。常用的一种方法是将图像中的每个像素映射到相同大小的数字矩阵中,矩阵中的值便可以用来表示像素的一些属性。
灰度缩放:每个数字图像都被缩放并且居中定位到给定大小的画布上(通常是28像素X28像素或64像素X64像素),每个像素的颜色强度在矩阵中被表示为0到1之间的值,其中1是纯黑色,0是纯白色。
彩色图片:每个像素可以使用三个特征来表示,每个RGB值对应一个特征。或者,如果倾向于保留单个特征,那么可以取三个RGB值的平均值。
相似图片判断:常用判断相似性的一种算法是余弦相似性,这个算法是计算X矩阵中每一行的单位向量。每行和其他行进行点乘,提供每对向量之间的余弦夹角。常用的另一张算法被称为卡方核算法,和余弦相似度计算类似,它将给出一个标量值,告诉我们两个向量之间的相似度。目前已经证明余弦相似度是自然语言处理工作的首选,而卡方核是处理图像任务的直接选择。
利用sklearn库中自带的mnist数据库。
from sklearn import datasets
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
digits = datasets.load_digits()
def display_img(img_no):
fig,ax = plt.subplots()
ax.set_xticklabels([]) #xticklabel 刻度值(竖线下面的数值)
ax.set_yticklabels([])
ax.matshow(digits.images[img_no],cmap = plt.cm.binary); #将2D矩阵或数组的值绘制为颜色编码图像。 cmap是颜色图谱
display_img(3) #是在8X8,总共64像素点上显示的
digits.images[0] #看到实际的矩阵,这些数字在0~16之间缩放
digits.data[0].shape #将矩阵展开为长度64的单个向量
digits.target[0] #和数据相关联的标签
#利用余弦相似度算法查找相似的图像
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity #导入余弦相似性算法
#计算第一个图像(索引是[0])和其他所有图像的之间的相似度
X = digits.data
co_sim = cosine_similarity(X[0].reshape(1,-1),X) #reshape(1,-1)其中1表示一行,-1表示未知列
#将结果放入pandas的DataFrame中并查看
cosf = pd.DataFrame(co_sim).T
cosf.columns = ['similarity']
cosf.sort_values('similarity',ascending = False) #降序排列
#利用卡方核来查看图像之间的相似度
from sklearn.metrics.pairwise import chi2_kernel
k_sim = chi2_kernel(X[0].reshape(1,-1),X)
kf = pd.DataFrame(k_sim).T #.T表示转置
kf.columns = ['similarity']
kf.sort_values('similarity',ascending = False)