python中文相似度_计算图像相似度——《Python也可以》之一

以本文就直接使用,没有再作降维处理了。

6 def make_regalur_image(img, size = (256, 256)):

7 return img.resize(size).convert('RGB')

转化为规则图像之后,可以调用 img.histogram() 方法获得直方图数据,如上文两图的直方图如下:

得到规则图像之后,图像的相似度计算就转化为直方图的距离计算了,本文依照如下公式进行直方图相似度的定量度量:

Sim(G,S)=,其中G,S为直方图,N 为颜色空间样点数

转换为相应的 Python 代码如下:

19 def hist_similar(lh, rh):

20 assert len(lh) == len(rh)

21 return sum(1 - (0 if l == r else float(abs(l - r))/max(l, r)) for l, r in zip(lh, rh))/len(lh)

22

23 def calc_similar(li, ri):

24 return hist_similar(li.histogram(), ri.histogram())

短短十行代码不到就完成了图片相似度的计算,再加上从硬盘读取图像的函数和测试代码,也不过二十行上下:

28 def calc_similar_by_path(lf, rf):

29 li, ri = make_regalur_image(Image.open(lf)), make_regalur_image(Image.open(rf))

30 return calc_similar(li, ri)

31

32 if __name__ == '__main__':

33 path = r'test/TEST%d/%d.JPG'

34 for i in xrange(1, 7):

35 print 'test_case_%d: %.3f%%'%(i, calc_similar_by_path('test/TEST%d/%d.JPG'%(i, 1), 'test/TEST%d/%d.JPG'%(i, 2))*100)

那么这样做的效果到底怎么样呢?且来看看测试结果(测试用例和代码请猛击这里下载):

test_case_1: 63.322%

test_case_2: 66.950%

test_case_3: 51.990%

test_case_4: 70.401%

test_case_5: 32.755%

test_case_6: 42.203%

结合我们肉眼对测试用例的观察,这个程序工作得还算可以。不过 test_case_4 就暴露了直方图的缺点:它只是图像中颜色的全局分布的描述,无法描述颜色的局部分布和色彩所处的位置。test_case_4 的规则图如下:

可以看到它们的色彩局部分布有相当大的不同,但事实上它们的全局直方图相当相似:

虽然从直方图来看两图是极其相似的,但上述算法计算出相似度为70.4%的结果肯定是不可接受的。那么,怎么样才能克服直方图的缺点呢?答案是把规则图像分块,再对相应的小块进行相似度计算,最后根据各小块的平均相似度来反映整个图片的相似度。在实验中,我们把规则图像分为 4x4 块,每块的分辨率为 64x64:

分割图像的代码为:

9 def split_image(img, part_size = (64, 64)):

10 w, h = img.size

11 pw, ph = part_size

12

13 assert w % pw == h % ph == 0

14

15 return [img.crop((i, j, i+pw, j+ph)).copy() /

16 for i in xrange(0, w, pw) /

17 for j in xrange(0, h, ph)]

相应地,把计算相似图的函数calc_similar()修改为:

23 def calc_similar(li, ri):

24 # return hist_similar(li.histogram(), ri.histogram())

25 return sum(hist_similar(l.histogram(), r.histogram()) for l, r in zip(split_image(li), split_image(ri))) / 16.0

进行这样的改进后,算法已经能够在一

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中有多种方法可以实现简单的文本相似度分析操作,下面将详细介绍一种常用的方法。 一、准备工作: 1. 导入必要的库:从sklearn中导入CountVectorizer和cosine_similarity。 2. 定义文本列表:将要比较的文本存储在一个列表中。 二、数据预处理: 1. 实例化CountVectorizer:使用CountVectorizer将文本转换为词频矩阵,每个文本中的每个词都是一个特征。 2. 计算词频矩阵:调用fit_transform方法将文本列表作为参数传递给CountVectorizer实例,得到词频矩阵。 三、相似度分析: 1. 计算余弦相似度矩阵:将词频矩阵作为参数传递给cosine_similarity函数,得到文本之间的余弦相似度矩阵。 四、结果解释: 1. 解释余弦相似度矩阵:余弦相似度矩阵是一个对称矩阵,对角线上的元素都是1,表示文本与自身的相似度为最大值1;非对角线上的元素表示两个不同文本之间的相似度,值越大表示相似度越高。 示例代码如下: ```python from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity # 定义文本列表 texts = ['这是一个文本。', '这是另一个文本。', '这是一个不同的文本。'] # 实例化CountVectorizer并计算词频矩阵 vectorizer = CountVectorizer() word_count_matrix = vectorizer.fit_transform(texts) # 计算余弦相似度矩阵 cosine_sim_matrix = cosine_similarity(word_count_matrix, word_count_matrix) # 解释余弦相似度矩阵 for i in range(len(texts)): for j in range(len(texts)): print(f"文本{i+1}与文本{j+1}的相似度为:{cosine_sim_matrix[i][j]}") ``` 这个示例中,我们使用CountVectorizer将文本转换为词频矩阵,然后使用cosine_similarity计算余弦相似度矩阵。最后,我们打印出每个文本与其他文本的相似度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值