用python编写matlab的bwmorph(image,'spur')

2024-04-23 09:57:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将一个matlab图像处理脚本移植到python/skimage中,但是没有找到matlab的bwmorph函数,特别是skimage中的'spur'操作。matlab文档对spur操作这样说:

Removes spur pixels. For example:
0  0  0  0           0  0  0  0
0  0  0  0           0  0  0  0
0  0  1  0  becomes  0  0  0  0
0  1  0  0           0  1  0  0
1  1  0  0           1  1  0  0

我用python实现了一个版本,可以很好地处理上述情况:

^{pr2}$

上面的方法是删除只有一个相邻像素的任何像素。在

不过,我注意到上述实现的行为与matlab的spur操作不同。以matlab中的这个例子为例:

0     0     0     0     0
0     0     1     0     0
0     1     1     1     1
0     0     1     0     0
0     0     0     0     0

becomes, via bwmorph(t,'spur',1):

0      0     0     0     0
0      0     0     0     0
0      0     1     1     1
0      0     0     0     0
0      0     0     0     0

spur操作比查看8邻居计数要复杂一些。我不清楚如何扩展我的实现以满足这种情况,而不使其过于激进(即删除有效像素)。在

matlab的spur的底层逻辑是什么?或者有一个python实现可以使用吗?在

更新: 我发现Octave使用LUT实现了spur:

case('spur')
      ## lut=makelut(inline("xor(x(2,2),(sum((x&[0,1,0;1,0,1;0,1,0])(:))==0)&&(sum((x&[1,0,1;0,0,0;1,0,1])(:))==1)&&x(2,2))","x"),3);
      ## which is the same as
      lut=repmat([zeros(16,1);ones(16,1)],16,1); ## identity
      lut([18,21,81,273])=0; ## 4 qualifying patterns
      lut=logical(lut);
      cmd="BW2=applylut(BW, lut);";

(通过https://searchcode.com/codesearch/view/9585333/) 假设这是正确的,我只需要能够在python中创建这个LUT并应用它。。。在


Tags: 函数文档脚本像素图像处理summatlabspur