Я пытаюсь определить локальные минимумы и максимумы в масштабе изображения.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 вы знаете?
Спасибо