update
This commit is contained in:
@@ -95,6 +95,43 @@ def run_sam_prompt(
|
||||
return m
|
||||
|
||||
|
||||
def expand_mask(mask_bool: np.ndarray, expand_px: int = 0) -> np.ndarray:
|
||||
"""
|
||||
轻微扩大二值 mask(用于消除边界过软/过细带来的“漏边”观感)。
|
||||
|
||||
- expand_px <= 0: 原样返回
|
||||
- expand_px > 0: 做 dilation(膨胀)expand_px 像素级别
|
||||
"""
|
||||
mask_bool = np.asarray(mask_bool, dtype=bool)
|
||||
if expand_px <= 0:
|
||||
return mask_bool
|
||||
|
||||
# 优先用 OpenCV(通常更快)
|
||||
try:
|
||||
import cv2 # type: ignore[import]
|
||||
|
||||
u8 = (mask_bool.astype(np.uint8) * 255)
|
||||
k = int(expand_px) * 2 + 1
|
||||
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (k, k))
|
||||
out = cv2.dilate(u8, kernel, iterations=1)
|
||||
return out > 127
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# 回退到 scipy(若存在)
|
||||
try:
|
||||
from scipy.ndimage import binary_dilation # type: ignore[import]
|
||||
|
||||
# 使用近似圆形结构元素
|
||||
r = int(expand_px)
|
||||
yy, xx = np.ogrid[-r : r + 1, -r : r + 1]
|
||||
selem = (xx * xx + yy * yy) <= (r * r)
|
||||
return binary_dilation(mask_bool, structure=selem)
|
||||
except Exception:
|
||||
# 再回退:无依赖时就不扩大(保持可用性)
|
||||
return mask_bool
|
||||
|
||||
|
||||
def mask_to_contour_xy(
|
||||
mask_bool: np.ndarray,
|
||||
epsilon_px: float = 2.0,
|
||||
|
||||
Reference in New Issue
Block a user