一. 引言
在视频处理、内容审核或自动化测试中,我们经常需要判断两帧图像是否"看起来一样"。例如,检测视频片头片尾的黑场,或者判断直播流是否卡顿(画面静止)。
最直观的方法就是像素级对比 。今天,我们将深入探讨一个基于像素相似度的算法实现,重点分析在对比前进行图像预处理(如裁剪、灰度化、二值化)对最终结果的影响。
二.核心算法逻辑
我们要实现的目标很简单:给定两张图片,判断它们是否相似度超过某个阈值(例如95%)。
整体流程如下:
- 预处理:调整尺寸、裁剪、色彩空间转换。
- 特征提取:将图像简化为易于计算的格式(二值化)。
- 对比计算:逐像素统计差异。
- 决策:根据相似度百分比返回结果。
三.步骤
第一步:图像预处理 binarization
在进行对比之前,直接使用RGB三通道数据进行计算量大且容易受微小色彩偏差干扰。因此,我们需要一个binarization(二值化)函数来简化图像。
1. 图像裁剪:聚焦关键区域
python
img = img[350:-350, 50:-50]
- 作用:在固定机位的场景下(如监控、录屏),画面边缘可能包含无关信息(如时间水印、黑边)。
- 原理:通过切片操作,我们去掉了上下各350像素,左右各50像素的区域。
- 优势:大大减少了计算量,并排除了动态干扰元素(如滚动的时间戳),让算法更关注画面核心内容。
2. 灰度化:降维打击
注意: 代码中有一个小错误,通常应使用
cv2.COLOR_RGB2GRAY或cv2.COLOR_BGR2GRAY,而不是cv2.COLOR_RGBA2GRAY,除非你确定输入包含Alpha通道。
python
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
- 为什么要灰度化?
- RGB图像:每个像素由3个数值(R, G, B)表示,范围0-255。
- 灰度图像:每个像素仅由1个数值表示亮度。
- 对比:如果直接对比RGB,三个通道必须完全一致才算相同,这在实际应用中过于严格(光照微调就会导致误判)。灰度化将三维数据降为一维,只要亮度一致即视为相同,鲁棒性更强。
3. 二值化:化繁为简
python
_, binary_img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
return binary_img
- 原理:设定一个阈值(如127)。像素值大于阈值的变为白色(255),小于的变为黑色(0)。
- 效果:图像被简化为只有黑白两色。这一步彻底过滤掉了光照渐变、噪点等干扰,只保留了画面的"轮廓"和"结构"信息。
第二步:相似度计算 pixel_similarity
这是算法的决策核心。它接收两张图像,经过预处理后,计算它们的相似度。
1. 尺寸对齐
现实场景中,待比较的两张图片尺寸可能不一致。
python
if img1.shape != img2.shape:
# 取最小宽高进行缩放
x, y = min([x1, x2]), min([y1, y2])
img1 = cv2.resize(img1, (x, y))
img2 = cv2.resize(img2, (x, y))
- 策略:这里采用的是"取最小公约数"策略,将较大的图缩小以匹配较小的图。你也可以选择填充(Padding)策略,但缩放通常更适用于内容结构一致的场景。
2. 像素级对比
python
equal_mask = (binarization(img1) == binarization(img2))
- 掩膜生成 :通过
==运算符,我们生成了一个布尔类型的掩膜(Mask)。如果对应位置像素相同,值为True,否则为False。
3. 相似度统计
python
total_pixels = equal_mask.size
same_pixels = np.count_nonzero(equal_mask)
similarity = same_pixels / total_pixels
- 计算逻辑 :统计
True的数量占总像素数量的比例。 - 返回值:返回一个布尔值(是否达标)和具体的相似度浮点数。
四.方法对比:不做预处理 vs 完善预处理
为了让你更直观地理解预处理的重要性,我们做一个对比实验:
| 处理阶段 | 计算复杂度 | 抗光照干扰能力 | 抗噪点能力 | 适用场景 |
|---|---|---|---|---|
| 直接RGB对比 | 高 (3通道) | 极差 | 差 | 需要绝对像素一致的场景 |
| 仅灰度化 | 中 (1通道) | 中 | 中 | 一般画面相似度检测 |
| 灰度+二值化 | 低 (0/1) | 强 | 强 | 固定机位、去重、黑屏检测 |
结论 :在固定机位的内容检测中,"裁剪 + 灰度化 + 二值化" 是性价比最高的组合。
五. 总结
通过这篇文章,我们实现了一个简易但高效的图像重复检测器。
- 图像裁剪帮助我们聚焦核心区域,去除非关键信息干扰。
- 灰度化与二值化是降维的关键,它们将复杂的色彩信息转化为简单的结构信息,极大地提升了算法的效率和稳定性。
- 像素相似度虽然简单,但在固定机位、背景不变的场景下,它是最直接、最可靠的判断依据。