import numpy as np import cv2 def create_depth_difference_mask(depth1: np.ndarray, depth2: np.ndarray, threshold: float = 0.1, gaussian_kernel: int = 5, min_region_size: int = 50) -> tuple[np.ndarray, np.ndarray]: """ 创建两个深度图之间差异的掩码图像,返回原始掩码和滤波后的掩码 Args: depth1: 第一个深度图 depth2: 第二个深度图 threshold: 判定为不一致的深度差异阈值 gaussian_kernel: 高斯滤波核大小 min_region_size: 最小连通区域大小,小于该值的区域将被过滤掉 Returns: tuple[np.ndarray, np.ndarray]: - raw_mask: 原始差异掩码,未经滤波处理 - filtered_mask: 经过滤波处理后的差异掩码 """ # 创建有效区域的掩码(两个深度图都有有效值的区域) valid_mask = (depth1 > 0) & (depth2 > 0) # 计算深度差异 diff = np.abs(depth1 - depth2) diff[~valid_mask] = 0 # 创建原始差异掩码 raw_mask = np.zeros_like(depth1, dtype=np.uint8) raw_mask[valid_mask & (diff > threshold)] = 255 # 对原始掩码进行高斯滤波 filtered_mask = cv2.GaussianBlur(raw_mask, (gaussian_kernel, gaussian_kernel), 0) # 重新二值化 _, filtered_mask = cv2.threshold(filtered_mask, 127, 255, cv2.THRESH_BINARY) # 应用形态学操作 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) filtered_mask = cv2.morphologyEx(filtered_mask, cv2.MORPH_OPEN, kernel) # 开运算去除小噪点 filtered_mask = cv2.morphologyEx(filtered_mask, cv2.MORPH_CLOSE, kernel) # 闭运算填充小孔 # 连通区域分析和过滤 if min_region_size > 0: num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(filtered_mask, connectivity=8) for i in range(1, num_labels): # 从1开始,跳过背景 if stats[i, cv2.CC_STAT_AREA] < min_region_size: filtered_mask[labels == i] = 0 return raw_mask, filtered_mask