首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在skimage的源代码中,这个看似递归的代码可以工作?

为什么在skimage的源代码中,这个看似递归的代码可以工作?
EN

Stack Overflow用户
提问于 2018-10-31 18:30:16
回答 1查看 70关注 0票数 1

skimage的模块_denoise.py中,我发现了以下代码:

代码语言:javascript
复制
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?它是如何工作的,为什么是这样?导入的是

代码语言:javascript
复制
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

它似乎并没有引入任何新的函数。

EN

回答 1

Stack Overflow用户

发布于 2018-10-31 18:44:31

请注意,estimate_sigma的递归调用位于if子句中:

代码语言:javascript
复制
if multichannel:
    sigmas = [estimate_sigma(image[..., c], multichannel=False)...
...
return _sigma_est_dwt(detail_coeffs, distribution='Gaussian')

情况A)如果我们用multichannel=False调用estimate_sigma,函数将不会进入If -子句内部,因此不会调用自身,并将返回到其主体的末尾。

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

基本上的想法是:如果我们有多个通道,让我们将它们分成单独的通道,并对每个通道进行sigma估计

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53081248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档