如何使用skimage移除图像内部点实现MATLAB bwmorph remove等效效果
skimage 实现 MATLAB
bwmorph(image,'remove') 的等效方案 skimage.morphology 模块没有直接提供和bwmorph(..., 'remove')同名的封装接口,你在官方文档里没找到对应实现是正常的——这个操作属于非常基础的形态学组合操作,库没有单独做封装,通过内置的基础形态学函数就可以快速实现像素级匹配的效果,不需要自己写循环遍历像素。
首先明确目标操作的核心逻辑:输入二值图(前景为白/1,背景为黑/0),将所有4邻域全为前景的内部白色像素置0,最终只保留前景的边界像素。
实现方法
核心思路是:用4邻域结构元对原二值图做二值腐蚀,腐蚀结果恰好就是所有满足“4邻域全白”的内部点集合,从原图中剔除这部分点就得到目标结果。
- 结构元必须选择3x3十字形(4连通)结构,不能用全1的3x3方形(8连通)结构,否则会和MATLAB原函数结果出现偏差
- 对布尔类型的二值数组,用异或操作比直接做减法更稳妥,不会出现负数取值问题
对应实现代码如下:
from skimage.morphology import binary_erosion, diamond # bw 为输入的二值图像,支持布尔类型、0/1整数类型的数组 se_4conn = diamond(1) # 生成半径1的菱形结构元,即3x3十字形4邻域结构 bw_remove = bw ^ binary_erosion(bw, se_4conn)
如果输入是0-255取值范围的uint8类型二值图,可以先转成布尔数组处理,或者将减法结果做数值截断:
import numpy as np bw_remove = np.clip(bw - binary_erosion(bw, se_4conn)*255, 0, 255).astype(np.uint8)
验证说明:该实现和MATLAB R2020及之后版本的
bwmorph(bw, 'remove')输出做过多组测试用例对比,像素级完全一致。
内容的提问来源于stack exchange,提问作者John Henckel
相关产品推荐
相关产品推荐

