Bwmorph (изображение, "шпора") в Python - PullRequest
0 голосов
/ 15 мая 2018

Я портирую скрипт обработки изображений Matlab на python / skimage и не смог найти функцию Matlab bwmorph , в частности операцию 'spur' в Skimage. Документы 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, которая прекрасно обрабатывает приведенный выше случай:

def _neighbors_conv(image):
    image = image.astype(np.int)
    k = np.array([[1,1,1],[1,0,1],[1,1,1]])
    neighborhood_count = ndimage.convolve(image,k, mode='constant', cval=1)
    neighborhood_count[~image.astype(np.bool)] = 0
    return neighborhood_count

def spur(image):
    return _neighbors_conv(image) > 1

def bwmorph(image, fn, n=1):
    for _ in range(n):
        image = fn(image)
    return image

t= [[0, 0, 0, 0],
    [0, 0, 1, 0],
    [0, 1, 0, 0],
    [1, 1, 0, 0]]
t = np.array(t)
print('neighbor count:')
print(_neighbors_conv(t))
print('after spur:')
print(bwmorph(t,spur).astype(np.int))

neighbor count:
[[0 0 0 0]
 [0 0 1 0]
 [0 3 0 0]
 [7 5 0 0]]
after spur:
[[0 0 0 0]
 [0 0 0 0]
 [0 1 0 0]
 [1 1 0 0]]

Вышеупомянутое работает, удаляя любые пиксели, у которых есть только один соседний пиксель.

Я заметил, что вышеприведенная реализация ведет себя иначе, чем операция spur в Matlab. Возьмите этот пример в 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

Операция «шпора» немного сложнее, чем рассмотрение количества 8 соседей. Мне не ясно, как расширить мою реализацию, чтобы удовлетворить этот случай, не делая его слишком агрессивным (т.е. удаляя допустимые пиксели).

Какова основная логика spur в Matlab или уже доступна реализация Python, которую я могу использовать?

UPDATE: Я нашел реализацию Spave в Octave, которая использует LUT:

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/) Предполагая, что это правильно, мне просто нужно иметь возможность создать этот LUT в python и применить его ...

1 Ответ

0 голосов
/ 24 мая 2018

Я сам реализовал собственную версию spur и другие операции bwmorph.Для будущих интернет-путешественников, которые испытывают такую ​​же потребность, вот полезный смысл того, что я в итоге использовал:

https://gist.github.com/bmabey/4dd36d9938b83742a88b6f68ac1901a6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...