一种基于颜色统计和特征指纹的图片相似度计算方法
1.摘要
图片相似度有很多实际应用,比如谷歌搜图、淘宝识物购买,现在很多类似应用已经使用神经网络训练实现,但是本文仅仅从图像处理角度出发,根据图像内容特征信息实现图片相似度计算。如题描述,我们将从颜色和内容信息两方面进行。
2.实现
本节内容将从原理、代码实现并结合应用效果介绍感知哈希算法和颜色分量统计算法
from math import sqrt
import numpy as np
import pandas as pd
import itertools
2.1.感知哈希算法
- 原理描述:结合离散余弦变换,将灰度图片所包含的特征生成一组指纹(哈希值),计算图片相似度即计算图片指纹的相似度。
- 关于离散余弦变换:灰度图是二维矩阵,由不同频率的成分组成。一般来说亮度变化小的区域是低频成分,它描述大范围的信息。而亮度变化剧烈的区域(比如物体的边缘)就是高频的成分,它描述具体的细节。由于大多数自然信号的能量都集中在余弦变换后的低频部分,可以舍弃信息含量更少的高频部分而提高计算效率,具体使用方法是离散余弦变换(DCT)。
- 具体步骤:
-
简化色彩:BGR2GRAY;
-
计算DCT:计算图片的DCT变换,得到32*32的DCT系数矩阵;
-
缩小DCT:保留左上角的8*8的矩阵(最低频率);
-
计算平均值:计算DCT的均值;
-
计算hash值:根据8*8的DCT矩阵,设置0或1的64位的hash值,大于等于DCT均值的设为”1”,小于DCT均值的设为“0”。将得到的二维数组拉伸成一维,构成了一个长度为64位的向量,这就是这张图片的指纹;
-
计算两张图片指纹,使用汉明距离计算相似度。
结果并不能告诉我们真实性的低频率,只能粗略地告诉我们较于平均值频率的相对比例。只要图片的整体结构保持不变,hash结果值就不变。能够避免伽马校正或颜色直方图被调整带来的影响。
#均值哈希算法
def aHash(img):
img=cv2.resize(img,(8,8),interpolation=cv2.INTER_CUBIC)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
s=0
hash_str=''
for i in range(8):