计算机视觉|比较两张图片的相似性

计算机视觉|比较两张图片的相似性
文章图片

计算机视觉|比较两张图片的相似性
文章图片

1、原图上可以发现的信息,两张图拍摄角度不一样,图一拍的比较正,聚焦近;图二拍的有点倾斜,聚焦远。光照不一样,图一光照亮度要比图二高。图片中水泥模子干湿程度不一样,图一的水泥已经完全干了;图二还是水泥的凝结过程中的一种状态。拍照的方向不一样,假定图一是正向;图二就是反向的。水泥模子之间的距离也是不一样的,图一挨得比较近;图二挨得比较远。
计算机视觉|比较两张图片的相似性
文章图片

计算机视觉|比较两张图片的相似性
文章图片

2、如果单从比较两张图片是否相同,那肯定不相同;若是比较图一中水泥模子是否为图二中水泥模子晾干之后的结果,那答案是相同的,可以将图一或者图二换成与之对应的相位就可以比较。肉眼可见确实是相同的,现在的问题是如何利用计算机视觉的技术让计算机来判断他们的相似性。
我的想法是:图片的共同点就是水泥模子上面的图案了,那应该是利用这一点来比较他们的相似性了。
计算机视觉|比较两张图片的相似性
文章图片
计算机视觉|比较两张图片的相似性
文章图片

为了想要计算机比较好的进行处理比较,我的想法是将图片的位数、尺寸进行统一化,所以变成上面这种尺寸统一的灰度图了,要想判断两张图片中的内容是否为同一个,那就需要进行特别特征的检测与提取了,比如可以选择水泥模子上的图案作为特征加上模子周围的轮廓特征,比较相同东西是否一样。这就相当于目标检测加识别了,需要足够的数据集搭建网络来训练了。关于细节部分还是不知道怎么实现。
【计算机视觉|比较两张图片的相似性】在网上调研发现opencv中有个函数可以判断两张图片是否相同:

import cv2 import numpy as npfile1 = 'results/1.png' file2 = 'results/2.png'img1 = cv2.imread(file1) img2 = cv2.imread(file2)cv2.imshow('img', img1) cv2.imshow('img', img2) cv2.waitKey(0)difference = cv2.subtract(img1, img2) result = not np.any(difference)# if difference is all zeros it will return Falseif result is True: print("两张图片一样") else: cv2.imwrite("result.jpg", difference) print("两张图片不一样")

也就是将上面的两幅灰度化处理后的统一尺寸的图片来进行操作,结果是相同的。以为得到了结果,其实这是错误的,上面的比较是将两幅图片进行相减,也即是两个数组进行相减,根据相减的结果判断;但是灰度化后,尺寸也统一了,它的数组是相同的,也就是说只要两张图片它所对应的数组是一样的,它的结果就是相同的。任意的两幅图片进行相同处理在这样相减都会得到图片是一样的结果,所以这种做法是错误的,这种方向都是错误的。要想判断图片相同,还的从特征入手,比较特征进行判断。

    推荐阅读