Как работает функция skimage.filters.laplace в Python? - PullRequest
1 голос
/ 20 июня 2020

Я пытаюсь выяснить, какое ядро ​​используется в функции лапласа skimage.filters. Я знаю, что лапласовский фильтр основан на свертке матриц, но я просто не могу понять значения, создаваемые функцией лапласа skimage.filters.

Это пример:

>>> import numpy as np
>>> import skimage
>>> from skimage.filters import laplace
>>> x = [[2,3,2],[5,3,6],[3,7,3]]
>>> x = np.array(x)
>>> x
array([[2, 3, 2],
       [5, 3, 6],
       [3, 7, 3]])
>>> laplace(x, ksize=3)
array([[ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
       [ 0.00000000e+00, -9.75781955e-19,  0.00000000e+00],
       [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00]])

Если функция лапласа skimage.filters использует ядро ​​/ оператор

[[ 0,  1, 0],
 [ 1, -4, 1],
 [ 0,  1, 0]]

, то согласно свертке матрицы она должна была выдать

[[ 0,  5, -1],
 [12, -9, 16],
 [ 0, 19, -1]]

вместо

[[ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
 [ 0.00000000e+00, -9.75781955e-19,  0.00000000e+00],
 [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00]]

Я очень смущен тем, что использует функция Laplace ядра / оператора skimage.filters, чтобы почти все выходные значения были настолько близки к нулю, например, -9.75781955e-19. Честно говоря, я не думаю, что какое-либо разумное ядро ​​/ оператор могло бы произвести такой вывод, поэтому, возможно, я просто не понимаю, как работает функция лапласа Python skimage.filters ...

Любая помощь / комментарии / предложения / идеи по этому вопросу были бы весьма признательны. Спасибо.

1 Ответ

0 голосов
/ 21 июня 2020

добро пожаловать в ветку scikit-изображений Stack Overflow! Причина такого странного поведения в том, что dtype из x равно int64, а функция scikit-image laplace вызывает img_as_float для выполнения вычислений в числах с плавающей запятой, но при приведении типа dtype это также делит массив на максимальное значение исходного dtype (здесь 2 ^ 63-1), следовательно, очень маленькие значения. Если вы хотите избежать этой проблемы, вы можете преобразовать изображение в плавающее перед передачей его в Laplace:

>>> x = x.astype(np.float)                                                
>>> filters.laplace(x)                                                    
array([[-4.,  2., -5.],
       [ 7., -9., 10.],
       [-6., 12., -7.]])

(функция использует режим граничных условий по умолчанию scipy.ndimage.convolve, который является «отражением»).

Обратите внимание, что это поведение (деление на максимальное значение dtype), вероятно, изменится с scikit-image 1.0 именно потому, что мы заметили, что это может сбивать с толку пользователей, как и в вашем случае.

...