我正在将一个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);";