如何使用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)
示例测试图像


内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

