Эквивалент imgaussfilt Matlab в Python - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь повторить поведение Matlab imgaussfilter в Python, но мне не удалось воспроизвести результаты. Документы не сильно помогают, так как нет объяснения того, что именно делается (например, чем эта функция отличается от fspecial или чем она отличается от imsmooth Октавы (с гауссовским в качестве аргумента).

Matlab Code

imgaussfilt(image,sigma)

с выводом

 [[-0.02936392 -0.03168419 -0.0343706  ...  0.03136455  0.02864487
   0.02585145]
 [-0.03212093 -0.0347433  -0.03775943 ...  0.03507484  0.03209807
   0.02906134]
 [-0.03512981 -0.03808864 -0.04147075 ...  0.03873834  0.03549163
   0.03219311]
 ...
 [-0.07713804 -0.08337475 -0.08975262 ... -0.04314206 -0.03945251
  -0.03606256]
 [-0.07145457 -0.07714807 -0.08297654 ... -0.03986635 -0.03641579
  -0.03323718]
 [-0.06605107 -0.07122191 -0.07651892 ... -0.03684535 -0.03362917
  -0.03065128]]

Самое близкое, что мне удалось получить с Python, было:

Python

skimage.filters.gaussian(image, sigma=s,mode = 'nearest',truncate=2.0)

с выводом

[[-0.02936397 -0.03168425 -0.03437067 ...  0.03136461  0.02864492
   0.0258515 ]
 [-0.03212099 -0.03474336 -0.03775951 ...  0.03507491  0.03209814
   0.0290614 ]
 [-0.03512988 -0.03808872 -0.04147083 ...  0.03873842  0.03549169
   0.03219317]
 ...
 [-0.07713819 -0.08337491 -0.08975279 ... -0.04314214 -0.03945259
  -0.03606263]
 [-0.07145471 -0.07714821 -0.0829767  ... -0.03986643 -0.03641586
  -0.03323725]
 [-0.06605119 -0.07122205 -0.07651907 ... -0.03684542 -0.03362923
  -0.03065134]]

, который аналогичен, но не совсем тот же результат. Есть ли метод, который приближает его лучше? Мне нужно изменить один из параметров

1 Ответ

2 голосов
/ 18 октября 2019

Есть несколько возможных причин для этого. Поскольку Matlab не является программным обеспечением с открытым исходным кодом, невозможно точно определить причину, но мы можем принять некоторые обоснованные предположения.

Относительно того, что делает Гауссова фильтрация : он заменяет каждый пиксель взвешеннымсумма его соседей. Вес определяется гауссовой функцией плотности вероятности , а точный вес определяется сигмой, а также параметром truncate, который вы можете видеть в документации scipy.ndimage.gaussian_filter. Этот параметр необходим, потому что технически функция Гаусса никогда не уменьшается до нуля, она просто приближается к нулю, когда расстояние уходит в бесконечность, поэтому для «идеального» размытия по Гауссу необходимо суммировать бесконечное число соседних пикселей, что невозможно. Следовательно, функция должна решить, насколько далеко вы находитесь достаточно близко к нулю, чтобы прекратить суммирование.

Дополнительным усложняющим фактором является то, что размытие по Гауссу отделимо , что означает, что вы можете сделать2D (или nD) размытие путем размытия отдельно вдоль каждой оси в последовательности, что может снизить вычислительные затраты. Отделимость влияет на порядок вычислений, а вычисление с плавающей запятой не точное , поэтому, если Matlab и Python выполняют операции в другом порядке, вы можете ожидать несколько разных результатов.

Даже есливы фильтруете оси в том же порядке (вы можете достичь этого, например, транспонируя изображение в Python, фильтруя, а затем транспонируя его обратно), базовые низкоуровневые библиотеки вычислений массива могут суммировать массивы в другом порядке, что опять-такиизменит точные результаты.

Короче говоря, некоторые возможные причины различий, которые вы видите:

  • различное усечение
  • различные реализации (разделение фильтра илине)
  • разный порядок обработки осей
  • разный порядок сумм низкого уровня

Может быть невозможно распутать их, и вконец моего совета отражает комментарий Криса Луенго: ваши результаты, вероятно, не должны полагаться на более точные ценностиБолее шести значащих цифр. Точное совпадение между Matlab и Python здесь будет бессмысленным, потому что ни один из них не может гарантировать идеальную точность относительно теоретического значения гауссовского фильтра. Оба являются приблизительными значениями, и только точное совпадение означает, что вы допускаете одинаковые ошибки в обоих случаях.

...