Ошибка фильтра Гаусса в питоне scipy_filters - PullRequest
0 голосов
/ 03 ноября 2018

Я хочу применить фильтр Гаусса к массиву с плавающей точкой, используя python2. На самом деле я пытаюсь переписать код Ретроспективная коррекция с использованием гомоморфной фильтрации в Python, g(x,y) = exp(LPF(log(f(x,y)))) . C

где LPF (f (x, y)) - фильтр нижних частот f (x, y), а C - коэффициент нормализации.

Вот мой код, который вылетает в строке: LPFF = scipy_filters.gaussian_filter1d (logF, sigma = 10)

fxy = greyscale_matrix
logF = np.log1p(fxy)
print logF
LPFF = scipy_filters.gaussian_filter1d(logF, sigma=10)
print LPFF
expF = np.expm1(LPFF)
tmp_div = fxy / expF
meanF_down = np.mean(tmp_div)
meanF_top = np.mean(fxy)
C = meanF_top / meanF_down
gx_matrix = expF * C
rtn_matrix = greyscale_matrix - gx_matrix

Image.fromarray(gx_matrix).show()
Image.fromarray(rtn_matrix).show()

Я пытаюсь отладить его при переходе на

def correlate1d(*args, **kwargs): # real signature unknown
    pass

из _nd_image.py код кажется сбойным без какой-либо идеи. Я также обнаружил, что github выполняет эту работу как Реализация гомоморфного фильтра, сделанного в Python , но что-то с ним не так.

Источник img: sourceimg

Использование этого может дать мне отфильтрованное изображение, например: отфильтрованное изображение Конечно, изменяя атрибуты, я могу сделать его светлее, но тенденция к чрезмерному затенению, очевидно, все еще существует.

Может ли кто-нибудь пролить свет на эту проблему? Большое спасибо!

1 Ответ

0 голосов
/ 04 ноября 2018

Вы не говорите, какую версию SciPy вы используете, но я подозреваю, что вы попали в ошибку , которая должна была быть исправлена ​​в SciPy версии 1.0.1 (и 1.1.0). Эта ошибка приводит к сбою интерпретатора, когда вход для функции фильтра Гаусса имеет тип данных numpy.float16. Если ваша матрица ввода fxy имеет тип numpy.uint8 (что типично для изображения), то numpy.log1p(fxy) возвращает массив с типом данных numpy.float16, например ::

In [29]: fxy = np.array([[0, 10], [128, 255]], dtype=np.uint8)

In [30]: logF = np.log1p(fxy)

In [31]: logF
Out[31]: 
array([[0.   , 2.398],
       [4.86 , 5.547]], dtype=float16)

logF имеет тип numpy.float16, и сбой происходит, когда вы передаете это gaussian_filter1d.

Быстрое исправление заключается в преобразовании fxy, скажем, в 64-битную плавающую точку перед передачей в np.log1p:

In [34]: logF = np.log1p(fxy.astype(np.float64))

In [35]: logF.dtype
Out[35]: dtype('float64')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...