53 lines
2.1 KiB
Python
53 lines
2.1 KiB
Python
|
|
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 |