Есть несколько возможных причин для этого. Поскольку Matlab не является программным обеспечением с открытым исходным кодом, невозможно точно определить причину, но мы можем принять некоторые обоснованные предположения.
Относительно того, что делает Гауссова фильтрация : он заменяет каждый пиксель взвешеннымсумма его соседей. Вес определяется гауссовой функцией плотности вероятности , а точный вес определяется сигмой, а также параметром truncate
, который вы можете видеть в документации scipy.ndimage.gaussian_filter
. Этот параметр необходим, потому что технически функция Гаусса никогда не уменьшается до нуля, она просто приближается к нулю, когда расстояние уходит в бесконечность, поэтому для «идеального» размытия по Гауссу необходимо суммировать бесконечное число соседних пикселей, что невозможно. Следовательно, функция должна решить, насколько далеко вы находитесь достаточно близко к нулю, чтобы прекратить суммирование.
Дополнительным усложняющим фактором является то, что размытие по Гауссу отделимо , что означает, что вы можете сделать2D (или nD) размытие путем размытия отдельно вдоль каждой оси в последовательности, что может снизить вычислительные затраты. Отделимость влияет на порядок вычислений, а вычисление с плавающей запятой не точное , поэтому, если Matlab и Python выполняют операции в другом порядке, вы можете ожидать несколько разных результатов.
Даже есливы фильтруете оси в том же порядке (вы можете достичь этого, например, транспонируя изображение в Python, фильтруя, а затем транспонируя его обратно), базовые низкоуровневые библиотеки вычислений массива могут суммировать массивы в другом порядке, что опять-такиизменит точные результаты.
Короче говоря, некоторые возможные причины различий, которые вы видите:
- различное усечение
- различные реализации (разделение фильтра илине)
- разный порядок обработки осей
- разный порядок сумм низкого уровня
Может быть невозможно распутать их, и вконец моего совета отражает комментарий Криса Луенго: ваши результаты, вероятно, не должны полагаться на более точные ценностиБолее шести значащих цифр. Точное совпадение между Matlab и Python здесь будет бессмысленным, потому что ни один из них не может гарантировать идеальную точность относительно теоретического значения гауссовского фильтра. Оба являются приблизительными значениями, и только точное совпадение означает, что вы допускаете одинаковые ошибки в обоих случаях.