使用Python 制作对比图片相似度的程序怎么比较?

Python014

使用Python 制作对比图片相似度的程序怎么比较?,第1张

就是给出以下几个function的def 越多越好:

1、 red_average(Picture) 算出pic众pixels的平均红值 。

2、scale_red(Picture, int) 调整图片红值 并确保其不超过255 。

3、expand_width(Picture, int)  。

4、reduce_width(Picture, int) 放大和缩小宽值 都是乘或者除的 ,distance(Pixel, Pixel) 以红蓝绿值为标准 计算两个pixel之间的距离(类似于xyz坐标轴中两点距离)。

5、simple_difference(Picture,Picture) 简单计算两张图片有多相似 不必考虑长宽。

6、smart_difference(Picture,Picture) 这个方程的步骤需为: 判断图片大小 。如必要 乘除高度 。 如必要 乘除宽度。 调整图片颜色使之相同平均红蓝绿值 。

Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中 有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。

代码

首先,读入TuriCreate软件包

import turicreate as tc

我们指定图像所在的文件夹image,让TuriCreate读取所有的图像文件,并且存储到data数据框

data = tc.image_analysis.load_images('./image/')

我们来看看,data数据框的内容:

data

data包含两列信息,第一列是图片的地址,第二列是图片的长宽描述。

下面我们要求TuriCreate给数据框中每一行添加一个行号。这将作为图片的标记,方便后面查找图片时使用,并输出查看data。

data = data.add_row_number()

data

下面,是重头戏。我们让TuriCreate根据输入的图片集合,建立图像相似度判别模型。

model = tc.image_similarity.create(data)

这个语句执行起来,可能需要一些时间。如果你是第一次使用TuriCreate,它可能还需要从网上下载一些数据。请耐心等待。

经过或长或短的等待,模型已经成功建立。

下面,我们来尝试给模型一张图片,让TuriCreate帮我们从目前的图片集合里,挑出最为相似的10张来。

为了方便,我们就选择第一张图片作为查询输入。

我们利用show()函数展示一下这张图片。

tc.Image(data[0]['path']).show()

下面我们来查询,我们让模型寻找出与这张图片最相似的10张。

similar_images = model.query(data[0:1], k=10)

我们把结果存储在了similar_images变量里面,下面我们来看看其中都有哪些图片。

similar_images

返回的结果一共有10行。跟我们的要求一致。

每一行数据,包含4列。分别是:

查询图片的标记

获得结果的标记

结果图片与查询图片的距离

结果图片与查询图片近似程度排序值

有了这些信息,我们就可以查看到底哪些图片与输入查询图片最为相似了。

注意其中的第一张结果图片,其实就是我们的输入图片本身。考虑它没有意义。

我们提取全部结果图片的标记(索引)值,忽略掉第一张(自身)。

similar_image_index = similar_images['reference_label'][1:]

把上面9张图片的标记在所有图片的索引列表中过滤出来:

filtered_index = data['id'].apply(lambda x : x in similar_image_index)

filtered_index

验证完毕以后,请执行以下语句。我们再次调用TuriCreate的explore()函数,展现相似度查询结果图片。

data[filtered_index].explore()

这个事情的基本思路是先将这个图片分成两个图片,具体步骤如下

这两个图片应该是一个大一个小,然后将小的那个作为基准,计算出小的那个图的灰度(称为A),然后将将大的那个按小的这个尺寸分成N个,分别计算着N个的灰度。

计算两个灰度图像之间的结构相似度指数,其实就是计算A和那N个小图的结构相似度指数。

通过这个结构相识度的数据,我们基本可以判断A是不是包含了相同图像的一部分,如果不是的话,将这个小的图移动到相邻的部分,然后重复1,2. 当计算完全部以后,找到机构相似度最高的那两个图,基本上相同图形就在这两个里面了。

里面的话,你需要用到openCV 和 Python 两个工具以及scikit-image和imutils。具体安装的流程你可以搜索一下。