本帖最后由 山顶小雪球 于 2025-12-8 22:46 编辑

简介
在数字图像处理时快速准确地识别相似图像是一个具有重要实际价值的技术。传统像素级对比方法在面对尺寸调整、格式转换或轻度编辑的图像时往往表现不佳,这里我们将使用基于pHash(感知哈希)技术开发的图像相似度比对算法。
特点
- 计算效率高,处理图像~20ms/图 (512×512)
- 内存占用小,单图哈希值仅需64bit位存储 (本可以是这样的,但易语言无符号处理有些困难,我这里改用64字节储存)
- 鲁棒性较强,基于DCT的低频特性,对噪声、格式、轻度编辑有良好适应性。
- 简单依赖少,不依赖深度学习框架,无大量参数需要调优。
- 确定性输出,相同输入永远产生相同哈希,适合需要可重复性的场景。
局限性
- 语义理解能力弱,语义相关但视觉差异大如不同品种的猫、相同物体不同背景。
- 对几何变换敏感,图像旋转、透视变换、镜像翻转、大幅裁剪时相似度会急剧下降。
系统架构
输入层:图像预处理
↓
处理引擎:pHash计算
↓
比对核心:汉明距离计算
↓
结果输出
什么是感知哈希
pHash(Perceptual Hash)是一种基于图像感知内容的哈希算法,它将图像转换为“指纹”字符串。与加密哈希不同,感知哈希的关键特性是:相似的图像会产生相似的哈希值,这一特性使其成为图像相似度检测的理想工具。
基本原理
-
缩放尺寸
统一调整为32×32像素(去除尺寸差异影响)
-
灰度化处理
转换为灰度图像(降低颜色干扰)
-
离散余弦变换(DCT)
DCT是一种特殊的傅立叶变换,将图片从像素域变换为频率域,并且DCT矩阵从左上角到右下角代表越来越高频率的系数。
-
计算哈希值
选取左上角8x8的矩阵,计算矩阵均值,将每个系数与均值比较并生成64位二进制哈希值
核心算法
离散余弦变换(Discrete Cosine Transform,简称DCT)是一种将信号从空间域转换到频率域的数学工具。简单来说,它能把一张图片分解成不同频率的"成分",就像把一首复杂的音乐分解成不同频率的音符一样。图像的主要视觉信息通常集中在低频部分(大面积的色块、主要轮廓),而高频部分(细节、噪声、纹理)对人类的视觉感知影响较小。
DCT恰好能:
- 分离出图像的低频成分
- 对光照变化不敏感
- 对压缩和轻微噪声有鲁棒性
基本公式:
F[u][v] = C(u) * C(v) *
求和(m=0到M-1) 求和(n=0到N-1)
f[m][n] *
cos(π * u * (2m+1) / (2M)) *
cos(π * v * (2n+1) / (2N))
其中:
- f[m][n]是原始图像在位置(m,n)的像素值
- F[u][v]是变换后的频率系数
- u、v是频率索引(0到M-1,0到N-1)
- C(u)的定义:
当u=0时,C(u) = sqrt(1/M)
当u>0时,C(u) = sqrt(2/M)
- C(v)同理
优化处理
预处理余弦表
DCT计算涉及大量的三角函数运算,为提高计算效率,我们预先计算并存储了32×32的余弦表。
预计算避免了在每次图像处理时重复计算三角函数,将DCT计算复杂度从O(N4)降低到O(N2),使计算效率提升约40%。
预处理归一化系数
在DCT变换后,为了确保结果的标准化,我们引入了归一化系数。归一化系数的计算基于DCT的逆变换性质,确保正变换和逆变换的一致性。
基于预处理余弦表和归一化系数,DCT计算可以表示为:
F(u,v)=NormCoeff[u,v]×∑ x=0∑ y=0f(x,y)×CosTable[x,u]×CosTable[y,v]
相似度评估的数学原理
图像相似度通过汉明距离评估:
HammingDistance=∑ i=0∣hash[i]−hash[i]∣
汉明距离越小,图像越相似。
我们可以使用汉明距离量化图像相似度:
相似度 = 1 - (汉明距离 / 64)
当汉明距离为0时,相似度为100%;距离越大,相似度越低。
结语
基于pHash的图像相似度比对在保持高效率的同时还有不错的准确度。之后我会再基于这一篇的内容,继续开发根据视频相似度查找相同视频文件的项目(其实最开始就是为了删掉电脑里重复的视频才开始写的这个:-) ),届时也会在论坛开源。
源码下载
|