def filter(img, msk, idx, bur, tor, mode):
nbs = neighbors(img.shape)
acc = np.cumprod((1,)+img.shape[::-1][:-1])[::-1]
img = img.ravel()
msk = msk.ravel()
arg = np.argsort(img[idx])[::-1 if mode else 1]
for i in arg:
if msk[idx[i]]!=3:
idx[i] = 0
continue
cur = 0; s = 1;
bur[0] = idx[i]
while cur<s:
p = bur[cur]
if msk[p] == 2:
idx[i]=0
break
for dp in nbs:
cp = p+dp
if msk[cp]==0 or cp==idx[i] or msk[cp] == 4: continue
if mode and img[cp] < img[idx[i]]-tor: continue
if not mode and img[cp] > img[idx[i]]+tor: continue
bur[s] = cp
s += 1
if s==msk.size//3:
cut = cur//2
msk[bur[:cut]] = 2
bur[:s-cut] = bur[cut:]
cur -= cut
s -= cut
if msk[cp]!=2:msk[cp] = 4
cur += 1
msk[bur[:s]] = 2
return idx2rc(idx[idx>0], acc)
评论列表
文章目录