Почему этот, казалось бы, рекурсивный код работает в исходном коде skimage?

В модуле _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

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

Что такого загадочного в функции, использующей рекурсию? Я действительно не понимаю, о чем вы просите.

trincot 31.10.2018 11:37
1
1
68
1

Ответы 1

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

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

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

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


Basically the idea is: if we've got multiple channels, let's divide them into separate ones and perform sigma estimation on each channel

О, теперь это имеет смысл! Это кажется немного запутанным, когда nchannels = image.shape[-1] все равно проверяет наличие нескольких каналов, но я полагаю, что должны быть какие-то особые сценарии, чтобы оправдать это.

komodovaran_ 31.10.2018 11:57

«Особые сценарии» - это объемные трехмерные изображения в оттенках серого. В этих случаях image.shape[-1] - это размер последнего измерения. (При multichannel=False; есть еще и многоканальные 3D изображения!)

Juan 10.12.2018 10:36

Другие вопросы по теме