Почему этот, казалось бы, рекурсивный код работает в источнике Skimage? - PullRequest
0 голосов
/ 31 октября 2018

В модуле _denoise.py из skimage я нашел следующий фрагмент кода:

def estimate_sigma(image, average_sigmas=False, multichannel=False):
        # some more code here
        sigmas = [estimate_sigma(image[..., c], multichannel=False)...
    return _sigma_est_dwt(detail_coeffs, distribution='Gaussian')

Внутри estimate_sigma есть estimate_sigma? Как и почему это работает? Импорт составляет

import scipy.stats
import numpy as np
from math import ceil
from .. import img_as_float
from ..restoration._denoise_cy import _denoise_bilateral, _denoise_tv_bregman
from .._shared.utils import skimage_deprecation, warn
import pywt
import skimage.color as color
import numbers

, который, кажется, не проникает ни в какие новые функции.

1 Ответ

0 голосов
/ 31 октября 2018

Обратите внимание, что рекурсивный вызов estimate_sigma находится внутри предложения if:

if multichannel:
    sigmas = [estimate_sigma(image[..., c], multichannel=False)...
...
return _sigma_est_dwt(detail_coeffs, distribution='Gaussian')

Случай A) Если мы вызовем estimate_sigma с multichannel=False, функция не попадет внутрь предложения if, поэтому не вызовет себя и вернется к концу своего тела.

Случай B) Если мы вызовем estimate_sigma с multichannel=True, условие выполнится успешно, поэтому estimate_sigma вызовет себя. Как видно из вышеприведенного фрагмента, когда estimate_sigma вызывает себя, он передает multichannel как False. Это означает, что во время рекурсивного вызова произойдет «случай А». На этот раз программа не войдет в указанный выше блок if, и рекурсия завершится, завершив выполнение функции и вернувшись.


По сути, идея такова: если у нас есть несколько каналов, давайте разделим их на отдельные каналы и проведем оценку сигма на каждом канале
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...