You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

53 lines
2.1 KiB

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