1.背景
要识别两张图片是否相似,首先我们可能会区分这两张图是人物照,还是风景照等......对应的风景照是蓝天还是大海......做一系列的分类。
从机器学习的的角度来说,首先要提取图片的特征,将这些特征进行分类处理,训练并建立模型,然后在进行识别。
但是让计算机去区分这些图片分别是哪一类是很不容易的,不过计算机可以知道图像的像素值的,因此,在图像识别过程中,通过颜色特征来识别是相似图片是我们常用的(当然还有其特征还有纹理特征、形状特征和空间关系特征等,这些有分为直方图,颜色集,颜色局,聚合向量,相关图等来计算颜色特征),
Python资源共享群:626017123
为了得到两张相似的图片,在这里通过以下几种简单的计算方式来计算图片的相似度:
- 直方图计算图片的相似度
- 通过哈希值,汉明距离计算
- 通过图片的余弦距离计算
- 通过图片结构度量计算
一、直方图计算图片的相似度
上三张图片,分别是img1.png, img2.jpg,img.png:
可以看出上面这三张图是挺相似的,在颜色上是差不多的,最相似的是哪两张大家可以猜猜看,看和我们计算的是否一样。
在python中利用opencv中的calcHist()方法获取其直方图数据,返回的结果是一个列表:
# 计算图img1的直方图 H1 = cv2.calcHist([img1], [1], None, [256], [0, 256]) H1 = cv2.normalize(H1, H1, 0, 1, cv2.NORM_MINMAX, -1) # 对图片进行归一化处理
先计算img1的直方图,在对其归一化,最后在分别对img2,img3计算,做归一化,然后在利用python自带的compareHist()进行相似度的比较:
利用compareHist()进行比较相似度 similarity1 = cv2.compareHist(H1, H2, 0)
最后得到三张图片的直方图如下:
图像的x轴是指的图片的0~255之间的像素变化,y轴指的是在这0~255像素所占的比列。
我们可以明显的看出img2与img3的直方图的变化趋势是相符的有重合态的,运行结果如下:
通过运行结果知道img2和img3是值是最为相似的(代码calcImage.py)
上面的是直接调用opencv中的方法来实现的,下面还有自己写的方法:
首先是将图片转化为RGB格式,在这里是用的pillow中的Image来对图片做处理的:
# 将图片转化为RGB def make_regalur_image(img, size=(64, 64)): gray_image = img.resize(size).convert('RGB') return gr