Нахождение локальных крайностей в 3D Numpy Array - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь определить локальные минимумы и максимумы в масштабе изображения.Scale Space - это просто трехмерный массив, где первые 2 измерения соответствуют значению пикселя изображения, а третье соответствует его масштабу (в каждом масштабе я фильтрую изображение с помощью гауссовского фильтра, делая его более размытым).

Вот как я вычисляю пространство шкалы:

def scalespace (image, size = 5, laplacian = True, fact = np.sqrt(2)):

    """Returns 3d numpy array containing scale space of image
    Each step corresponds to the gaussian filter applied with a step = sqrt(2)      
    The first scale corresponds to the original image.
    """

    scale_space = np.zeros((image.shape[0],image.shape[1],size))
    image_copy = image.copy()
    scale_space[:,:,0] = image_copy

    for s in range(1,size):

        #convolve on previous scale
        filtered_image = ndi.filters.gaussian_filter(scale_space[:,:,s-1], sigma = fact*np.sqrt(s))
        if laplacian:
            filtered_image = ndi.filters.laplace(filtered_image)

        scale_space[:,:,s] = filtered_image

    return scale_space

Теперь мне нужно найти локальные минимумы и максимумы (я делаю обнаружение BLOB-объектов).Я нахожу это довольно прямолинейным для одного изображения (2D-случай), но теперь, когда мне также нужно учитывать, является ли значение пикселя максимальным / минимальным во всех масштабах, я нахожу это трудным.В 2-м случае я сделал это так:

if len(image.shape) == 2:

    min_x,min_y = scipy.signal.argrelextrema(image, np.less, order = n_order, axis = 0) 
    min_2d = [(j,i) for i,j in zip(min_x,min_y)]
    max_x,max_y = scipy.signal.argrelextrema(image, np.greater, order = n_order, axis = 0) 
    max_2d = [(j,i) for i,j in zip(max_x,max_y)]

    #check on the other direction
    min_x,min_y = scipy.signal.argrelextrema(image, np.less, order = n_order, axis = 1) 
    new_min_2d = [(j,i) for i,j in zip(min_x,min_y) if (j,i) in min_2d]
    max_x,max_y = scipy.signal.argrelextrema(image, np.greater, order = n_order, axis = 1) 
    new_max_2d = [(j,i) for i,j in zip(max_x,max_y) if (j,i) in max_2d]

Я пытался адаптировать это к 3D-пространству, но это просто беспорядок, и я чувствую, что должен быть более простой способ сделать это?Есть идеи, ребята?Есть ли другие ресурсы, кроме этой функции scipy вы знаете?

Спасибо

...