图像相似度计算主要有两方面应用:
- 用于计算机视觉中的检测跟踪中目标位置的获取,根据已有模板在图像中找到一个与之最接近的区域。然后一直跟着。已有的一些算法比如BlobTracking,Meanshift,Camshift,粒子滤波等等也都是需要这方面的理论去支撑。
- 基于图像内容的图像检索,也就是以图搜图。
图像相似度计算常见算法
PSNR峰值信噪比
PSNR是最普遍和使用最为广泛的一种图像客观评价指标,然而它是基于对应像素点间的误差,即基于误差敏感的图像质量评价。
优点:速度快。
缺点:由于并未考虑到人眼的视觉特性(人眼对空间频率较低的对比差异敏感度较高,人眼对亮度对比差异的敏感度较色度高,人眼对一个区域的感知结果会受到其周围邻近区域的影响等),因而经常出现评价结果与人的主观感觉不一致的情况。
感知哈希算法
感知哈希算法(perceptual hash algorithm),它的作用是对每张图像生成一个“指纹”(fingerprint)字符串,然后比较不同图像的指纹。结果越接近,就说明图像越相似。 一般是利用像素点与平均像素值的大小生成一个二进制指纹。
优点:速度快。
缺点:受均值影响太大;效果一般。
计算特征点
主要是通过检测如FAST、SURF、SIFT、ORB以及Harris角点等特征点,如果相似特征点较多,则认为两张图片相似。
优点:具有旋转、尺度等不变性,较准确。
缺点:计算量大。
直方图匹配
分别计算两幅图像的直方图,然后计算它们的相关系数(实际上也就是两个向量的差异)。
优点:计算简单。
缺点:
- 直方图反映的只是像素的概率分布,与像素的位置无关,然而两张图片内容差别较大,灰度概率分布差异很小也是有可能的。(可以利用分块进行改进。)
- 对光照敏感。
数学上的矩阵分解
图像本身就是一个矩阵,可以依靠数学上矩阵分解的一些知识来获取矩阵中一些代表这个矩阵元素值和分布的一些鲁棒性特征来对图像的相似度进行计算。
最常用的一般是SVD分解和NMF分解。有人使用SVD+NMF结合取得了不错的效果。
基于局部纹理特征的图像相似度计算
上述方法基本只能达到粗糙的效果,很多时候两幅整体相似但细节差异较大的图可能判定相似,难以得到精确的结果。
LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子;它具有旋转不变性和灰度不变性等显著的优点。
原始的LBP算子定义为在3*3
的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素 点的位置被标记为1,否则为0。这样,3*3
邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像 素点的LBP值,并用这个值来反映该区域的纹理信息。
LBP特征跟位置信息是紧密相关的。直接对两幅图片提取LBP,并进行判别分析的话,会因为“位置没有 对准”而产生很大的误差。可以用分块来解决这个问题。
对LBP特征向量进行提取的步骤:
- 将图片缩小尺寸,去除部分高频和细节;
- 将检测窗口划分为若干个小区域(cell);
- 对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经比较可产生8位二进制数,即得到该窗口中心像素点的LBP值;
- 计算每个cell的直方图,即每个数字(假定是十进制数LBP值)出现的频率;然后对该直方图进行归一化处理。
- 将得到的每个cell的统计直方图进行连接成为一个特征向量,也就是整幅图的LBP纹理特征向量;
- 通过一定的度量方法(如皮尔逊相关系数)比较两张图片的LBP特征向量的相似度。
上述其实就是基于LBP的人脸识别算法,在图像相似度计算的实际应用中有几点需要注意:
- 直接比较周围像素值与中心像素值的大小,可能会太灵敏,可设定一个阈值(一般为1~2),像素差与阈值进行比较。
- 图片缩放的大小、子块大小、数量都对结果有着直接的影响,可以根据实际效果选择合适的参数。
- 实际应用中发现对缩放后的图片进行
3*3
的模糊滤波,能实现更好的效果。