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
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 |