河南南阳收割机被堵事件:官员缺德,祸患无穷

极目新闻领导公开“记者毕节采访被打”细节:他们打人后擦去指纹

突发!员工跳楼!只拿低保工资!央企设计院集体罢工!

退休后的温家宝

突发!北京某院集体罢工!

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

动态规划“遇见”图像检索

指象 数据指象 2022-07-01

两个对象的相似度的多少,统计学上常用的方法是对象在多维属性空间的距离来量化。同样图像也是对象的一种;


它是有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))
有问题的小伙伴,可以私聊哦,创作不易,喜欢点赞

推荐阅读:

小妙招:让图像会说话,字字清晰

R语言,制作常用图表

ggplot2:让图表更顺滑

文章有问题?点此查看未经处理的缓存