动态规划“遇见”图像检索
两个对象的相似度的多少,统计学上常用的方法是对象在多维属性空间的距离来量化。同样图像也是对象的一种;
它是有RGB三基色的像素点组合合成;RGB本身就是一张图像的属性;[0~255]是属性值域值。
但是同一张图像经过裁剪、旋转、光线的调节、滤镜是图像的像素值发生巨大的变化,所以如何简单粗暴的匹配两张图像的像素的精准确率就会大打折扣。
利用时间序列+动态规划的弹性匹配是一个稳定匹配相似图像的方法。
1,构造图像的时间序列。
将图像的RGB值,首尾拼接成一个一维数组;以索引下标作为横轴,RGB值作为纵轴,我们可以绘制出一个时间序列的折线图。
2,两个图像时序距离计算方法
统计中我们了解到了很多距离计算的方法,比如:欧式距离、曼哈顿距离、欧几里得距离等,距离方法的选择要适合场景需要,选择最优的就行;可以尝试多种距离计算对比效果。
3,最优路径的查找
两个图像距离的计算,其实就是两个时间序列的二位矩阵中找到最优的路径。动态规划是数据挖掘中常用的计算距离的方法。
图中简单做了一个实例:同一张图片的两个序列段(方便比较),这里的距离计算简单的使用了两点相减的绝对值。绿色标记出了最优的滤镜,最优路径的累积值越小,可以判断两个图像的相似度越高。
这里我们也选择使用动态规划来找最优路径。
4,具体实战
这里我选择了7张图片,然后通过相似度的计算,通过相似度强弱来排序。这里选择第三张“二熊戏水”的图片最为匹配的锚点。目前的图片顺序如下:
通过相似度计算结果:
第三张“二熊戏水” 最优路径累积值为0.0,完全相似
第四张“熊吼” 最优路径累积值为18837.0,次居第二
后续为:第七张、第五张、第六张、第一张、第二张
结果还是很准确的。
代码参考:
from PIL import Image from numpy import arrayimport mlpyfrom collections import OrderedDictdata = {}imgs = ['', #数字下标从0 开始,这里填充0位 'data/256_ObjectCategories/001.ak47/001_0002.jpg', #第1张图 'data/256_ObjectCategories/003.backpack/003_0001.jpg',#第2张图 'data/256_ObjectCategories/009.bear/009_0001.jpg',#第3张图 'data/256_ObjectCategories/009.bear/009_0009.jpg',#第4张图 'data/256_ObjectCategories/009.bear/009_0010.jpg',#第5张图 'data/256_ObjectCategories/009.bear/009_0011.jpg',#第6张图 'data/256_ObjectCategories/009.bear/009_0012.jpg'#第7张图 ]for fn in range(1, 8): img = Image.open(imgs[fn]) arr = array(img) list = [] for n in arr: list.append(n[0][0]) #R for n in arr: list.append(n[0][1]) #G for n in arr: list.append(n[0][2]) #B data[fn] = listreference = data[3] # 这里以第三章图片作为基准result = {}for x, y in data.items(): dist = mlpy.dtw_std(reference, y, dist_only=True) result[x] = distsortedRes = OrderedDict(sorted(result.items(), key=lambda x: x[1]))for a, b in sortedRes.items(): print("{0}-{1}".format(a, b))推荐阅读: