You need to enable JavaScript to run this app. 如何使用OpenCV检测视角与光照微差的两张图像之间的差异
优惠活动
大模型
产品
解决方案
定价
更多

如何使用OpenCV检测视角与光照微差的两张图像之间的差异

轻微视角与光照差异下的OpenCV图像差异检测实现方案

核心实现步骤

  • 优化图像对齐精度:仅使用全局单应性变换适配轻微视角偏移场景效果较差,可先通过SIFT特征提取+双轮RANSAC过滤离群匹配点重算单应性矩阵,若仍存在局部错位,可将图像切分为32x32的网格块,对每个小块单独做仿射变换实现局部对齐,大幅提升匹配精度
  • 光照归一化预处理:避免光照差异造成伪差分结果,先将图像转换为LAB色彩空间,仅对L亮度通道做CLAHE限制对比度自适应直方图均衡化,保留色彩通道不变,统一两张图的亮度分布
  • 差分提取与后处理:对齐完成后使用逐像素差分得到差值图,通过OTSU自适应阈值生成二值掩码,再经过形态学开闭运算过滤噪声,最后通过连通域分析筛除面积过小的非目标区域,即可得到真实差异内容(如示例中的绿色贴纸)

核心代码示例

import cv2
import numpy as np

# 光照归一化函数
def light_normalize(img):
    lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
    l_channel, a_channel, b_channel = cv2.split(lab)
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
    cl = clahe.apply(l_channel)
    return cv2.cvtColor(cv2.merge((cl, a_channel, b_channel)), cv2.COLOR_LAB2BGR)

# 读取待检测图像
img_base = cv2.imread("base.jpg")
img_test = cv2.imread("test.jpg")
img_h, img_w = img_base.shape[:2]

# 光照预处理
img_base_norm = light_normalize(img_base)
img_test_norm = light_normalize(img_test)

# 此处为优化后的图像对齐步骤,对齐完成后得到img_test_align
# 对齐代码可基于SIFT特征匹配+局部块仿射变换实现

# 计算差异
diff_map = cv2.absdiff(img_base_norm, img_test_align)
gray_diff = cv2.cvtColor(diff_map, cv2.COLOR_BGR2GRAY)
# 自适应阈值生成掩码
_, diff_mask = cv2.threshold(gray_diff, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 形态学去噪
kernel = np.ones((5, 5), np.uint8)
diff_mask = cv2.morphologyEx(diff_mask, cv2.MORPH_OPEN, kernel)
diff_mask = cv2.morphologyEx(diff_mask, cv2.MORPH_CLOSE, kernel)

# 提取差异区域
diff_result = cv2.bitwise_and(img_test, img_test, mask=diff_mask)

示例测试图像

示例图像1
示例图像2

内容的提问来源于stack exchange,提问作者Basj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 06:06:04