为什么在skimage的源代码中,这种看似递归的代码有效?

时间:2018-10-31 10:30:16

标签: python scikit-image

_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 :(得分:3)

请注意,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子句的内部,因此不会调用自身,并将返回到其主体的末尾。 / p>

情况B)如果我们用estimate_sigma调用multichannel=True,则条件将成功,因此estimate_sigma会调用自身。从上面的源代码中可以看出,当estimate_sigma进行自身调用时,它将multichannel作为False传递。这意味着在递归调用期间将发生“情况A”。这次,程序将不会进入上面的if块,并且递归将结束,从而结束函数的执行并返回。


基本上,这个想法是:如果我们有多个通道,让我们将它们划分为单独的通道,然后对每个通道执行sigma估计