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:
侵蚀效果(灰色为被侵蚀的区域):
内容的提问来源于stack exchange,提问作者Damon Maria
相关产品推荐
相关产品推荐

