You need to enable JavaScript to run this app. OpenCV中带孔洞mask从侧边水平侵蚀x像素的高效实现方法
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV中带孔洞mask从侧边水平侵蚀x像素的高效实现方法

无Python循环的mask水平侵蚀实现

方案说明

完全匹配需求逻辑:仅从每行左右外边缘向内侵蚀固定像素数,内部孔洞不影响总侵蚀像素计数,全部操作通过numpy矢量化实现,无Python层面循环,处理超大尺寸mask时效率远高于逐行遍历方案。

实现代码

import numpy as np

def horizontal_erode_mask(mask, erode_px):
    # 输入mask要求为二值uint8/bool数组,0代表背景,非0代表前景
    # 计算每行从左到右的前景像素累积和
    left_cumsum = np.cumsum(mask, axis=1)
    left_erode_region = left_cumsum <= erode_px

    # 计算每行从右到左的前景像素累积和
    right_cumsum = np.cumsum(mask[:, ::-1], axis=1)[:, ::-1]
    right_erode_region = right_cumsum <= erode_px

    # 标记总前景像素不足2倍侵蚀宽度的行,整行清空
    total_fg_per_row = np.sum(mask, axis=1, keepdims=True)
    invalid_row = total_fg_per_row < 2 * erode_px

    # 生成最终mask
    eroded_mask = mask & ~left_erode_region & ~right_erode_region & ~invalid_row
    return eroded_mask.astype(mask.dtype)

# 调用示例
erode_px = 5
mask = horizontal_erode_mask(mask, erode_px)

逻辑说明

该实现和逐行遍历代码逻辑完全一致:

  • 每行左侧侵蚀的终止位置为第erode_px个前景像素的左侧
  • 每行右侧侵蚀的起始位置为倒数第erode_px个前景像素的右侧
  • 整行前景总数不足erode_px*2时整行置为背景

效果示例

原始mask:
Original mask
侵蚀效果(灰色为被侵蚀的区域):
result

内容的提问来源于stack exchange,提问作者Damon Maria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 04:21:03