skimage.restoration
#
图像恢复模块。
创建一个用于修复的球形核。rolling_ball. |
|
校准一个去噪函数并返回最优的J-不变版本。 |
|
循环旋转(将函数重复应用于x的移位版本)。 |
|
使用双边滤波器对图像进行去噪。 |
|
应用一个去噪函数的J-不变版本。 |
|
对2D-4D的灰度或RGB图像执行非局部均值去噪。 |
|
使用分裂Bregman优化进行全变差去噪。 |
|
在n维中执行总变差去噪。 |
|
对图像执行小波去噪。 |
|
创建一个用于恢复的椭球核。restoration.rolling_ball. |
|
基于小波的鲁棒估计器,用于估计(高斯)噪声的标准差。 |
|
使用双调和方程在图像中填充掩码点。 |
|
Richardson-Lucy 反卷积。 |
|
通过滚动/平移一个核来估计背景强度。 |
|
无监督维纳-亨特反卷积。 |
|
从包裹相位图像中恢复原始图像。 |
|
Wiener-Hunt 反卷积 |
- skimage.restoration.ball_kernel(radius, ndim)[源代码][源代码]#
创建一个用于修复的球形核。rolling_ball.
- 参数:
- 半径整数
球的半径。
- ndim整数
球的维度数。
ndim
应与将应用内核的图像的维度相匹配。
- 返回:
- 内核ndarray
包含椭球上半部分表面强度的核心。
参见
- skimage.restoration.calibrate_denoiser(image, denoise_function, denoise_parameters, *, stride=4, approximate_loss=True, extra_output=False)[源代码][源代码]#
校准一个去噪函数并返回最优的J-不变版本。
返回的函数已经部分评估,设置了最佳参数值以对输入图像进行去噪处理。
- 参数:
- 图像ndarray
要进行去噪处理的输入数据(使用 img_as_float 转换)。
- denoise_function函数
待校准的去噪函数。
- denoise_parameters列表的字典
denoise_function 的参数范围,用于校准。
- strideint, 可选
在将 denoise_function 转换为 J-不变性的掩码过程中使用的步幅。
- approximate_lossbool, 可选
是否通过仅在图像的一个掩码版本上计算来近似用于评估去噪器的自监督损失。如果为False,运行时间将比原来长 stride**image.ndim 倍。
- extra_outputbool, 可选
如果为真,除了校准的去噪函数外,还返回参数和损失。
- 返回:
- 最佳去噪函数函数
denoise_function 的最佳 J-不变版本。
- 如果 extra_output 为 True,则还会返回以下元组:
- (测试的参数, 损失)tuple (dict 列表, int 列表)
denoise_function 测试的参数列表,作为 kwargs 字典 每个 parameters_tested 参数集的自监督损失。
注释
校准过程使用自监督的均方误差损失来评估 denoise_function 的 J-不变版本的性能。自监督损失的最小化也是地面真值损失(即,真实的均方误差)的最小化 [1]。返回的函数可以用于原始的噪声图像,或其他具有相似特征的图像。
- 增加步幅可以提高 best_denoise_function 的性能
以增加其运行时间为代价。它对校准的运行时间没有影响。
参考文献
[1]J. Batson & L. Royer. Noise2Self: Blind Denoising by Self-Supervision, International Conference on Machine Learning, p. 524-533 (2019).
示例
>>> from skimage import color, data >>> from skimage.restoration import denoise_tv_chambolle >>> import numpy as np >>> img = color.rgb2gray(data.astronaut()[:50, :50]) >>> rng = np.random.default_rng() >>> noisy = img + 0.5 * img.std() * rng.standard_normal(img.shape) >>> parameters = {'weight': np.arange(0.01, 0.3, 0.02)} >>> denoising_function = calibrate_denoiser(noisy, denoise_tv_chambolle, ... denoise_parameters=parameters) >>> denoised_img = denoising_function(img)
- skimage.restoration.cycle_spin(x, func, max_shifts, shift_steps=1, num_workers=None, func_kw=None, *, channel_axis=None)[源代码][源代码]#
循环旋转(将函数重复应用于x的移位版本)。
- 参数:
- x类似数组
输入到
func
的数据。- 函数函数
一个应用于
x
的循环移位版本的函数。应将x
作为其第一个参数。任何额外的参数可以通过func_kw
提供。- max_shiftsint 或 tuple
如果是一个整数,将在
x
的每个轴上使用range(0, max_shifts+1)
的移位。如果是一个元组,将在第 i 轴上使用range(0, max_shifts[i]+1)
的移位。- shift_stepsint 或 tuple,可选
沿轴 i 应用的位移的步长为::
range((0, max_shifts[i]+1, shift_steps[i]))
。如果提供了一个整数,则所有轴使用相同的步长。- num_workersint 或 None, 可选
在循环旋转期间使用的并行线程数。如果设置为
None
,则使用所有可用核心。- func_kwdict, 可选
提供给
func
的额外关键字参数。- channel_axisint 或 None, 可选
如果为 None,则假定图像是灰度图像(单通道)。否则,此参数指示数组的哪个轴对应于通道。
Added in version 0.19:
channel_axis
在 0.19 版本中被添加。
- 返回:
- avg_ynp.ndarray
func(x, **func_kw)
的输出在所有指定轴移位的组合上的平均值。
注释
循环旋转被提出作为一种通过执行移位变量变换的几个循环移位来接近移位不变性的方法 [1]。
对于n级离散小波变换,可能希望执行所有位移,直到
max_shifts = 2**n - 1
。在实践中,通常只需每个轴进行少量位移即可获得大部分效益。对于诸如块状离散余弦变换的变换,人们可能希望评估的位移达到变换所使用的块大小。
参考文献
[1]R.R. Coifman 和 D.L. Donoho。 “平移不变去噪”。《小波与统计》,统计学讲义,第103卷。Springer,纽约,1995年,第125-150页。 DOI:10.1007/978-1-4612-2544-7_9
示例
>>> import skimage.data >>> from skimage import img_as_float >>> from skimage.restoration import denoise_tv_chambolle, cycle_spin >>> img = img_as_float(skimage.data.camera()) >>> sigma = 0.1 >>> img = img + sigma * np.random.standard_normal(img.shape) >>> denoised = cycle_spin(img, func=denoise_tv_chambolle, ... max_shifts=3)
- skimage.restoration.denoise_bilateral(image, win_size=None, sigma_color=None, sigma_spatial=1, bins=10000, mode='constant', cval=0, *, channel_axis=None)[源代码][源代码]#
使用双边滤波器对图像进行去噪。
- 参数:
- 图像ndarray, 形状 (M, N[, 3])
输入图像,2D 灰度或 RGB。
- win_size整数
过滤窗口的大小。如果未指定 win_size,则计算为
max(5, 2 * ceil(3 * sigma_spatial) + 1)
。- sigma_color浮动
灰度值/颜色距离的标准差(辐射相似性)。较大的值会导致对辐射差异较大的像素进行平均。如果为
None
,则将使用image
的标准差。- sigma_spatial浮动
范围距离的标准偏差。较大的值会导致对空间差异较大的像素进行平均。
- bins整数
颜色过滤的高斯权重的离散值数量。较大的值会提高准确性。
- 模式{‘常量’, ‘边缘’, ‘对称’, ‘反射’, ‘环绕’}
如何处理图像边界外的值。详情请参见
numpy.pad
。- cvalint 或 float
与模式 ‘constant’ 结合使用时,图像边界外的值。
- channel_axisint 或 None, 可选
如果
None
,则假定图像是灰度图像(单通道)。否则,此参数指示数组的哪个轴对应于通道。Added in version 0.19:
channel_axis
在 0.19 版本中被添加。
- 返回:
- 去噪ndarray
去噪图像。
注释
这是一个边缘保留的去噪滤波器。它根据像素的空间接近度和辐射相似性进行平均 [1]。
空间接近度是通过两个像素之间的欧几里得距离的高斯函数和某个标准差(sigma_spatial)来衡量的。
辐射相似性是通过两个颜色值之间的欧几里得距离的高斯函数和某个标准差(sigma_color)来测量的。
请注意,如果图像的dtype是任何`int`类型,``image``将使用`img_as_float`函数进行转换,因此标准差(sigma_color)将在范围``[0, 1]``内。
有关 scikit-image 的数据类型转换以及在这些转换中如何重新缩放图像的更多信息,请参见:https://scikit-image.org/docs/stable/user_guide/data_types.html。
参考文献
[1]C. Tomasi and R. Manduchi. “Bilateral Filtering for Gray and Color Images.” IEEE International Conference on Computer Vision (1998) 839-846. DOI:10.1109/ICCV.1998.710815
示例
>>> from skimage import data, img_as_float >>> astro = img_as_float(data.astronaut()) >>> astro = astro[220:300, 220:320] >>> rng = np.random.default_rng() >>> noisy = astro + 0.6 * astro.std() * rng.random(astro.shape) >>> noisy = np.clip(noisy, 0, 1) >>> denoised = denoise_bilateral(noisy, sigma_color=0.05, sigma_spatial=15, ... channel_axis=-1)
- skimage.restoration.denoise_invariant(image, denoise_function, *, stride=4, masks=None, denoiser_kwargs=None)[源代码][源代码]#
应用一个去噪函数的J-不变版本。
- 参数:
- 图像ndarray (M[, N[, …]][, C]) 的 ints, uints 或 floats
要进行去噪的输入数据。image 可以是任何数值类型,但在计算去噪图像时,它会被转换为浮点型的 ndarray(使用 img_as_float)。
- denoise_function函数
原始的去噪函数。
- strideint, 可选
在将 denoise_function 转换为 J-不变性的掩码过程中使用的步幅。
- 掩码ndarray 列表,可选
用于计算J-不变输出的掩码集合。如果为 None,将使用覆盖图像的完整掩码集。
- denoiser_kwargs:
传递给 denoise_function 的关键字参数。
- 返回:
- 输出ndarray
去噪后的图像,形状与 image 相同。
注释
一个去噪函数是 J-不变的,如果它对每个像素的预测不依赖于原始图像中该像素的值。每个像素的预测可以使用图像其余部分包含的所有相关信息,这通常是非常重要的。任何函数都可以通过简单的掩码程序转换为 J-不变的函数,如[1]中所述。
J-不变去噪器的逐像素误差与噪声无关,只要每个像素的噪声是独立的。因此,去噪图像与噪声图像之间的平均差异,即 自监督损失,与去噪图像与原始干净图像之间的差异,即 *真实损失*(至多相差一个常数)相同。
这意味着对于给定的图像,最佳的 J-不变去噪器可以通过仅使用噪声数据,通过选择最小化自监督损失的去噪器来找到。
参考文献
[1]J. Batson & L. Royer. Noise2Self: Blind Denoising by Self-Supervision, International Conference on Machine Learning, p. 524-533 (2019).
示例
>>> import skimage >>> from skimage.restoration import denoise_invariant, denoise_tv_chambolle >>> image = skimage.util.img_as_float(skimage.data.chelsea()) >>> noisy = skimage.util.random_noise(image, var=0.2 ** 2) >>> denoised = denoise_invariant(noisy, denoise_function=denoise_tv_chambolle)
- skimage.restoration.denoise_nl_means(image, patch_size=7, patch_distance=11, h=0.1, fast_mode=True, sigma=0.0, *, preserve_range=False, channel_axis=None)[源代码][源代码]#
对2D-4D的灰度或RGB图像执行非局部均值去噪。
- 参数:
- 图像2D 或 3D ndarray
要进行去噪的输入图像,可以是2D或3D,并且可以是灰度或RGB(仅适用于2D图像,参见
channel_axis
参数)。可以有任意数量的通道(不一定严格为RGB)。- patch_sizeint, 可选
用于去噪的补丁大小。
- patch_distanceint, 可选
用于去噪的补丁搜索的最大像素距离。
- hfloat, 可选
截止距离(以灰度级表示)。h 值越高,接受补丁的宽容度越大。较高的 h 值会导致图像更平滑,但会牺牲特征的清晰度。对于标准差为 sigma 的高斯噪声,一个经验法则是选择 h 的值为 sigma 或略小。
- 快速模式bool, 可选
如果为 True(默认值),则使用非局部均值算法的快速版本。如果为 False,则使用原始版本的非局部均值。有关算法的更多详细信息,请参阅注释部分。
- sigmafloat, 可选
(高斯)噪声的标准差。如果提供,将计算更稳健的补丁权重,该计算考虑了预期的噪声方差(见下文注释)。
- preserve_rangebool, 可选
是否保留原始值范围。否则,输入图像将根据 img_as_float 的约定进行转换。另请参见 https://scikit-image.org/docs/dev/user_guide/data_types.html
- channel_axisint 或 None, 可选
如果为 None,则假定图像是灰度图像(单通道)。否则,此参数指示数组的哪个轴对应于通道。
Added in version 0.19:
channel_axis
在 0.19 版本中被添加。
- 返回:
- 结果ndarray
去噪后的图像,形状与 image 相同。
注释
非局部均值算法非常适合用于去噪具有特定纹理的图像。该算法的原理是,在给定像素的值与有限邻域内其他像素的值之间进行平均,前提是这些其他像素为中心的 块 与感兴趣像素为中心的块足够相似。
在算法的原始版本 [1] 中,对应于
fast=False
,计算复杂度为:image.size * patch_size ** image.ndim * patch_distance ** image.ndim
因此,改变补丁的大小或它们的最大距离对计算时间有强烈的影响,特别是对于3-D图像。
然而,默认行为对应于
fast_mode=True
,此时使用另一种版本的非局部均值 [2],其复杂度为:image.size * patch_distance ** image.ndim
计算时间仅轻微依赖于补丁大小,这得益于对给定偏移量的补丁距离积分计算,从而减少了操作次数 [1]。因此,该算法比经典算法(
fast_mode=False
)执行得更快,但代价是使用两倍的内存。与其他替代方案相比,这一实现已被证明更为高效,参见例如 [3]。与经典算法相比,一个补丁的所有像素对到另一个补丁的距离贡献相同权重,无论它们到补丁中心的距离如何。这种较粗略的距离计算可能会导致去噪性能稍差。此外,对于小图像(图像的线性尺寸仅为补丁尺寸的几倍),经典算法由于边界效应可能会更快。
在去噪之前,图像使用 skimage.util.pad 的 reflect 模式进行填充。
如果提供了噪声标准差 sigma,则会使用更稳健的补丁权重计算方法。从计算的补丁距离中减去已知的噪声方差可以改进补丁相似性的估计,从而适度提高去噪性能 [4]。在 [3] 中,它也被提及为算法快速变体的一个选项。
当提供 sigma 时,通常应使用较小的 h 以避免过度平滑。h 的最佳值取决于图像内容和噪声水平,但一个合理的起点是
h = 0.8 * sigma
当 fast_mode 为 True 时,或h = 0.6 * sigma
当 fast_mode 为 False 时。参考文献
[1] (1,2)A. Buades, B. Coll, & J-M. Morel. A non-local algorithm for image denoising. In CVPR 2005, Vol. 2, pp. 60-65, IEEE. DOI:10.1109/CVPR.2005.38
[2]J. Darbon, A. Cunha, T.F. Chan, S. Osher, and G.J. Jensen, Fast nonlocal filtering applied to electron cryomicroscopy, in 5th IEEE International Symposium on Biomedical Imaging: From Nano to Macro, 2008, pp. 1331-1334. DOI:10.1109/ISBI.2008.4541250
[4]A. Buades, B. Coll, & J-M. Morel. Non-Local Means Denoising. Image Processing On Line, 2011, vol. 1, pp. 208-212. DOI:10.5201/ipol.2011.bcm_nlm
示例
>>> a = np.zeros((40, 40)) >>> a[10:-10, 10:-10] = 1. >>> rng = np.random.default_rng() >>> a += 0.3 * rng.standard_normal(a.shape) >>> denoised_a = denoise_nl_means(a, 7, 5, 0.1)
- skimage.restoration.denoise_tv_bregman(image, weight=5.0, max_num_iter=100, eps=0.001, isotropic=True, *, channel_axis=None)[源代码][源代码]#
使用分裂Bregman优化进行全变差去噪。
给定 \(f\),一个带有噪声的图像(输入数据),总变差去噪(也称为总变差正则化)旨在找到一个总变差小于 \(f\) 的图像 \(u\),在约束条件下 \(u\) 保持与 \(f\) 相似。这可以通过 Rudin–Osher–Fatemi (ROF) 最小化问题来表达:
\[\min_{u} \sum_{i=0}^{N-1} \left( \left| \nabla{u_i} \right| + \frac{\lambda}{2}(f_i - u_i)^2 \right)\]其中 \(\lambda\) 是一个正参数。这个代价函数的第一项是总变差;第二项表示数据保真度。当 \(\lambda \to 0\) 时,总变差项占主导地位,迫使解的总变差更小,但代价是看起来不太像输入数据。
这段代码是Goldstein和Osher的分裂Bregman算法的实现,用于解决ROF问题([1],[2],[3])。
- 参数:
- 图像ndarray
要进行去噪处理的输入图像(使用
img_as_float()
转换)。- 重量float, 可选
去噪权重。它等于 \(\frac{\lambda}{2}\)。因此,权重 越小,去噪效果越强(但与 图像 的相似度降低)。
- epsfloat, 可选
容差 \(\varepsilon > 0\) 用于停止准则:当 \(\|u_n - u_{n-1}\|_2 < \varepsilon\) 时,算法停止。
- max_num_iterint, 可选
用于优化的最大迭代次数。
- 各向同性布尔值,可选
在各向同性和各向异性TV去噪之间切换。
- channel_axisint 或 None, 可选
如果
None
,则假定图像是灰度图像(单通道)。否则,此参数指示数组的哪个轴对应于通道。Added in version 0.19:
channel_axis
在 0.19 版本中被添加。
- 返回:
- undarray
去噪图像。
参见
denoise_tv_chambolle
在n维中执行总变差去噪。
注释
确保 channel_axis 参数为彩色图像设置正确。
总变差去噪的原理在 [4] 中解释了。它涉及最小化图像的总变差,这可以粗略地描述为图像梯度范数的积分。总变差去噪倾向于产生卡通般的图像,即分段常数图像。
参考文献
[1]Tom Goldstein 和 Stanley Osher,“用于 L1 正则化问题的 Split Bregman 方法”,https://ww3.math.ucla.edu/camreport/cam08-29.pdf
[2]Pascal Getreuer, “Rudin–Osher–Fatemi 总变差去噪使用 Split Bregman” 在 Image Processing On Line 2012年5月19日, https://www.ipol.im/pub/art/2012/g-tvd/article_lr.pdf
- skimage.restoration.denoise_tv_chambolle(image, weight=0.1, eps=0.0002, max_num_iter=200, *, channel_axis=None)[源代码][源代码]#
在n维中执行总变差去噪。
给定 \(f\),一个带有噪声的图像(输入数据),总变差去噪(也称为总变差正则化)旨在找到一个总变差小于 \(f\) 的图像 \(u\),在约束条件下 \(u\) 保持与 \(f\) 相似。这可以通过 Rudin–Osher–Fatemi (ROF) 最小化问题来表达:
\[\min_{u} \sum_{i=0}^{N-1} \left( \left| \nabla{u_i} \right| + \frac{\lambda}{2}(f_i - u_i)^2 \right)\]其中 \(\lambda\) 是一个正参数。这个代价函数的第一项是总变差;第二项表示数据保真度。当 \(\lambda \to 0\) 时,总变差项占主导地位,迫使解的总变差更小,但代价是看起来不太像输入数据。
此代码是 Chambolle 在 [1] 中提出的算法实现,用于解决 ROF 问题。
- 参数:
- 图像ndarray
要进行去噪的输入图像。如果其数据类型不是浮点型,则会使用
img_as_float()
进行转换。- 重量float, 可选
去噪权重。它等于 \(\frac{1}{\lambda}\)。因此,权重 越大,去噪效果越强(但会牺牲对 图像 的保真度)。
- epsfloat, 可选
容差 \(\varepsilon > 0\) 用于停止准则(与成本函数 \(E\) 的相对差异的绝对值进行比较):当 \(|E_{n-1} - E_n| < \varepsilon * E_0\) 时,算法停止。
- max_num_iterint, 可选
用于优化的最大迭代次数。
- channel_axisint 或 None, 可选
如果
None
,则假定图像是灰度图像(单通道)。否则,此参数指示数组的哪个轴对应于通道。Added in version 0.19:
channel_axis
在 0.19 版本中被添加。
- 返回:
- undarray
去噪图像。
参见
denoise_tv_bregman
使用分裂Bregman优化进行全变差去噪。
注释
确保为彩色图像适当地设置 channel_axis 参数。
总变差去噪的原理在 [2] 中解释了。它涉及最小化图像的总变差,这可以粗略地描述为图像梯度范数的积分。总变差去噪倾向于产生卡通般的图像,即分段常数图像。
参考文献
[1]A. Chambolle, An algorithm for total variation minimization and applications, Journal of Mathematical Imaging and Vision, Springer, 2004, 20, 89-97.
示例
宇航员图像上的2D示例:
>>> from skimage import color, data >>> img = color.rgb2gray(data.astronaut())[:50, :50] >>> rng = np.random.default_rng() >>> img += 0.5 * img.std() * rng.standard_normal(img.shape) >>> denoised_img = denoise_tv_chambolle(img, weight=60)
合成数据上的3D示例:
>>> x, y, z = np.ogrid[0:20, 0:20, 0:20] >>> mask = (x - 22)**2 + (y - 20)**2 + (z - 17)**2 < 8**2 >>> mask = mask.astype(float) >>> rng = np.random.default_rng() >>> mask += 0.2 * rng.standard_normal(mask.shape) >>> res = denoise_tv_chambolle(mask, weight=100)
- skimage.restoration.denoise_wavelet(image, sigma=None, wavelet='db1', mode='soft', wavelet_levels=None, convert2ycbcr=False, method='BayesShrink', rescale_sigma=True, *, channel_axis=None)[源代码][源代码]#
对图像执行小波去噪。
- 参数:
- 图像ndarray (M[, N[, …P]][, C]) 的整数、无符号整数或浮点数
要进行去噪的输入数据。image 可以是任何数值类型,但在计算去噪图像时,它会被转换为浮点型的 ndarray。
- sigma浮点数或列表,可选
计算小波细节系数阈值时使用的噪声标准差。当为 None(默认)时,噪声标准差通过 [2] 中的方法估计。
- 小波字符串,可选
要执行的小波类型,可以是
pywt.wavelist
输出的任何选项。默认值是 ‘db1’。例如,wavelet
可以是{'db2', 'haar', 'sym9'}
以及更多。- 模式{‘soft’, ‘hard’}, 可选
选择执行的去噪类型的可选参数。需要注意的是,在给定加性噪声的情况下,选择软阈值可以找到原始图像的最佳近似。
- wavelet_levelsint 或 None, 可选
要使用的小波分解层数。默认值是可能的最大分解层数减去三。
- convert2ycbcrbool, 可选
如果为 True 且设置了 channel_axis,则在 YCbCr 色彩空间中进行小波去噪,而不是在 RGB 色彩空间中。这通常会为 RGB 图像带来更好的性能。
- 方法{‘BayesShrink’, ‘VisuShrink’}, 可选
要使用的阈值方法。目前支持的方法是“BayesShrink” [1] 和“VisuShrink” [2]。默认为“BayesShrink”。
- rescale_sigmabool, 可选
如果为 False,则不会对用户提供的
sigma
进行重新缩放。默认值为True
,如果图像在内部进行了重新缩放,则会适当地重新缩放 sigma。Added in version 0.16:
rescale_sigma
在 0.16 版本中引入- channel_axisint 或 None, 可选
如果
None
,则假定图像是灰度图像(单通道)。否则,此参数指示数组的哪个轴对应于通道。Added in version 0.19:
channel_axis
在 0.19 版本中被添加。
- 返回:
- 出ndarray
去噪图像。
注释
小波域是图像的稀疏表示,可以类似于傅里叶变换的频域来考虑。稀疏表示的大多数值为零或接近零,而真正的随机噪声在小波域中通常由许多小值表示。将所有低于某个阈值的值设置为0可以减少图像中的噪声,但较大的阈值也会降低图像中存在的细节。
如果输入是3D,此函数会分别对每个颜色平面进行小波去噪。
在 0.16 版本发生变更: 对于浮点输入,原始输入范围保持不变,输出不会进行裁剪。其他输入类型将根据输入图像范围转换为范围在 [-1, 1] 或 [0, 1] 的浮点值。除非
rescale_sigma = False
,否则应用于image
的任何内部重缩放也将应用于sigma
以保持相同的相对幅度。已经提出了许多小波系数阈值处理方法。默认情况下,
denoise_wavelet
应用 BayesShrink,这是一种自适应阈值处理方法,它为每个小波子带计算单独的阈值,如 [1] 中所述。如果
method == "VisuShrink"
,则根据 [2] 中所述,对所有小波细节系数应用一个“通用阈值”。该阈值旨在以高概率去除给定sigma
下的所有高斯噪声,但往往会使图像显得过于平滑。尽管可以从
PyWavelets
中选择任何小波,但阈值方法假设为正交小波变换,可能无法为双正交小波选择适当的阈值。正交小波是理想的,因为输入中的白噪声在子带中仍然是白噪声。双正交小波会导致子带中的噪声有色化。此外,PyWavelets 中的正交小波是正交的,因此子带中的噪声方差与输入的噪声方差相同。示例正交小波包括 Daubechies(例如 ‘db2’)或 symmlet(例如 ‘sym2’)系列。参考文献
[1] (1,2)Chang, S. Grace, Bin Yu, 和 Martin Vetterli. “自适应小波阈值用于图像去噪和压缩.” 图像处理, IEEE 交易 9.9 (2000): 1532-1546. DOI:10.1109/83.862633
[2] (1,2,3)D. L. Donoho and I. M. Johnstone. “Ideal spatial adaptation by wavelet shrinkage.” Biometrika 81.3 (1994): 425-455. DOI:10.1093/biomet/81.3.425
示例
>>> from skimage import color, data >>> img = img_as_float(data.astronaut()) >>> img = color.rgb2gray(img) >>> rng = np.random.default_rng() >>> img += 0.1 * rng.standard_normal(img.shape) >>> img = np.clip(img, 0, 1) >>> denoised_img = denoise_wavelet(img, sigma=0.1, rescale_sigma=True)
- skimage.restoration.ellipsoid_kernel(shape, intensity)[源代码][源代码]#
创建一个用于恢复的椭球核。restoration.rolling_ball.
- 参数:
- 形状类似数组
椭球主轴的长度(不包括强度轴)。核需要与其将应用到的图像具有相同的维度。
- 强度整数
椭球体强度轴的长度。
- 返回:
- 内核ndarray
包含椭球上半部分表面强度的核心。
参见
- skimage.restoration.estimate_sigma(image, average_sigmas=False, *, channel_axis=None)[源代码][源代码]#
基于小波的鲁棒估计器,用于估计(高斯)噪声的标准差。
- 参数:
- 图像ndarray
用于估计噪声标准差的图像。
- average_sigmasbool, 可选
如果为真,则平均 sigma 的通道估计值。否则返回对应于每个通道的 sigma 列表。
- channel_axisint 或 None, 可选
如果
None
,则假定图像是灰度图像(单通道)。否则,此参数指示数组的哪个轴对应于通道。Added in version 0.19:
channel_axis
在 0.19 版本中被添加。
- 返回:
- sigma浮点数或列表
估计的噪声标准差。如果 multichannel 为 True 且 average_sigmas 为 False,则返回每个通道的单独噪声估计。否则,返回各个通道估计的平均值。
注释
此函数假设噪声服从高斯分布。估计算法基于小波细节系数的绝对中位差,如[Rbc448ac95825-1]_的第4.2节所述。
参考文献
[1]D. L. Donoho and I. M. Johnstone. “Ideal spatial adaptation by wavelet shrinkage.” Biometrika 81.3 (1994): 425-455. DOI:10.1093/biomet/81.3.425
示例
>>> import skimage.data >>> from skimage import img_as_float >>> img = img_as_float(skimage.data.camera()) >>> sigma = 0.1 >>> rng = np.random.default_rng() >>> img = img + sigma * rng.standard_normal(img.shape) >>> sigma_hat = estimate_sigma(img, channel_axis=None)
- skimage.restoration.inpaint_biharmonic(image, mask, *, split_into_regions=False, channel_axis=None)[源代码][源代码]#
使用双调和方程在图像中填充掩码点。
- 参数:
- 图像(M[, N[, …, P]][, C]) ndarray
输入图像。
- 掩码(M[, N[, …, P]]) ndarray
要进行修复的像素数组。必须与’image’通道之一的形状相同。未知的像素必须用1表示,已知的像素用0表示。
- split_into_regions布尔值,可选
如果为 True,则逐区域进行修复。这可能会更慢,但会减少内存需求。
- channel_axisint 或 None, 可选
如果为 None,则假定图像是灰度图像(单通道)。否则,此参数指示数组的哪个轴对应于通道。
Added in version 0.19:
channel_axis
在 0.19 版本中被添加。
- 返回:
- 出(M[, N[, …, P]][, C]) ndarray
带有掩码像素的输入图像已修复。
参考文献
[1]S.B.Damelin 和 N.S.Hoang。“通过双调和函数进行表面补全和图像修复:数值方面”,国际数学与数学科学杂志,第2018卷,文章ID 3950312 DOI:10.1155/2018/3950312
[2]C. K. Chui and H. N. Mhaskar, MRA Contextual-Recovery Extension of Smooth Functions on Manifolds, Appl. and Comp. Harmonic Anal., 28 (2010), 104-113, DOI:10.1016/j.acha.2009.04.004
示例
>>> img = np.tile(np.square(np.linspace(0, 1, 5)), (5, 1)) >>> mask = np.zeros_like(img) >>> mask[2, 2:] = 1 >>> mask[1, 3:] = 1 >>> mask[0, 4:] = 1 >>> out = inpaint_biharmonic(img, mask)
- skimage.restoration.richardson_lucy(image, psf, num_iter=50, clip=True, filter_epsilon=None)[源代码][源代码]#
Richardson-Lucy 反卷积。
- 参数:
- 图像ndarray
输入降质的图像(可以是n维的)。
- psfndarray
点扩散函数。
- num_iterint, 可选
迭代次数。此参数起到正则化的作用。
- 剪辑布尔值,可选
默认情况下为真。如果为真,结果中像素值大于1或小于-1的部分将被阈值化,以兼容skimage管道。
- filter_epsilon: float, 可选
低于此值的中间结果变为0,以避免被小数除。
- 返回:
- im_deconvndarray
去卷积后的图像。
参考文献
示例
>>> from skimage import img_as_float, data, restoration >>> camera = img_as_float(data.camera()) >>> from scipy.signal import convolve2d >>> psf = np.ones((5, 5)) / 25 >>> camera = convolve2d(camera, psf, 'same') >>> rng = np.random.default_rng() >>> camera += 0.1 * camera.std() * rng.standard_normal(camera.shape) >>> deconvolved = restoration.richardson_lucy(camera, psf, 5)
- skimage.restoration.rolling_ball(image, *, radius=100, kernel=None, nansafe=False, num_threads=None)[源代码][源代码]#
通过滚动/平移一个核来估计背景强度。
这个滚动球算法估计了在曝光不均匀情况下的ndimage的背景强度。它是常用滚动球算法 [1] 的泛化。
- 参数:
- 图像ndarray
要过滤的图像。
- 半径int, 可选
图像中要滚动/平移的球形核的半径。如果
kernel = None
则使用。- 内核ndarray,可选
要在图像中滚动/翻译的内核。它必须与
image
具有相同的维度数。内核填充了该位置的内核强度。- nansafe: bool, 可选
如果
False``(默认)假设 ``image
中的所有值都不是np.nan
,并使用更快的实现。- num_threads: int, 可选
要使用的最大线程数。如果为
None
,则使用 OpenMP 的默认值;通常等于虚拟核心的最大数量。注意:这是线程数量的上限。确切的线程数由系统的 OpenMP 库决定。
- 返回:
- 背景ndarray
图像的估计背景。
注释
对于背景强度被估计的像素(不失一般性,在
center
处),滚动球方法在其下方中心放置kernel
并提升核直到表面触及图像的暗影在某pos=(y,x)
处。然后使用该位置的图像强度(image[pos]
)加上kernel[center] - kernel[pos]
的差异来估计背景强度。该算法假设暗像素对应于背景。如果你有一个明亮的背景,在将图像传递给函数之前反转图像,例如使用 utils.invert。详情请参见图库示例。
该算法对噪声敏感(特别是椒盐噪声)。如果这在您的图像中是一个问题,您可以在将图像传递给此函数之前应用轻微的高斯平滑。
该算法的复杂度在半径上是多项式的,其阶数等于图像的维度(2D图像为N^2,3D图像为N^3,等等),因此当半径增长到30以上时,它可能会花费很长时间([2],[3])。这是一个精确的N维计算;如果只需要一个近似值,可以考虑更快的选项,如顶帽滤波[R62497d9283b1-4]_或先缩小再放大的方法来减少处理输入的大小。
参考文献
[1]Sternberg, Stanley R. “生物医学图像处理”。计算机 1 (1983): 22-34. DOI:10.1109/MC.1983.1654163
示例
>>> import numpy as np >>> from skimage import data >>> from skimage.restoration import rolling_ball >>> image = data.coins() >>> background = rolling_ball(data.coins()) >>> filtered_image = image - background
>>> import numpy as np >>> from skimage import data >>> from skimage.restoration import rolling_ball, ellipsoid_kernel >>> image = data.coins() >>> kernel = ellipsoid_kernel((101, 101), 75) >>> background = rolling_ball(data.coins(), kernel=kernel) >>> filtered_image = image - background
- skimage.restoration.unsupervised_wiener(image, psf, reg=None, user_params=None, is_real=True, clip=True, *, rng=None)[源代码][源代码]#
无监督维纳-亨特反卷积。
使用维纳-亨特方法返回去卷积,其中超参数是自动估计的。该算法是一个随机迭代过程(吉布斯采样器),如以下参考文献所述。另请参见
wiener
函数。- 参数:
- 图像(M, N) ndarray
输入的退化图像。
- psfndarray
脉冲响应(输入图像的空间)或传递函数(傅里叶空间)。两者均可接受。传递函数会自动识别为复数(
np.iscomplexobj(psf)
)。- regndarray,可选
正则化算子。默认情况下是拉普拉斯算子。它可以是一个脉冲响应或传递函数,就像psf一样。
- 用户参数dict, 可选
Gibbs 采样器的参数字典。见下文。
- 剪辑布尔值,可选
默认情况下为真。如果为真,结果中像素值大于1或小于-1的部分将被阈值化,以确保与skimage管道的兼容性。
- rng : {
numpy.random.Generator
, int}, 可选toctree
是一个 reStructuredText 指令 ,这是一个非常多功能的标记。指令可以有参数、选项和内容。 伪随机数生成器。默认情况下,使用 PCG64 生成器(参见
numpy.random.default_rng()
)。如果 rng 是整数,则用于为生成器设定种子。Added in version 0.19.
- 返回:
- x_postmean(M, N) ndarray
去卷积图像(后验均值)。
- 链条dict
键
noise
和prior
分别包含噪声和先验精度的链表。
- 其他参数:
- ``user_params`` 的键是:
- 阈值浮动
停止准则:连续近似解(对象样本的经验均值,见注释部分)之间的差异范数。默认为1e-4。
- 烧录整数
开始计算平均值时要忽略的样本数量。默认为15。
- min_num_iter整数
最小迭代次数。默认值为30。
- max_num_iter整数
如果
threshold
未满足,最大迭代次数。默认为200。- 回调callable(默认为 None)
用户提供的可调用对象,如果该函数存在,则传递当前图像样本,用于任何目的。用户可以存储样本,或计算均值以外的其他矩。它不影响算法执行,仅用于检查。
注释
估计的图像被设计为概率定律(来自贝叶斯分析)的后验均值。均值定义为所有可能图像的加权和,权重为其各自的概率。鉴于问题的规模,精确的和是不可行的。该算法使用 MCMC 从后验定律中抽取图像。实际的想法是只抽取高概率的图像,因为它们对均值的贡献最大。相反,低概率的图像抽取的次数较少,因为它们的贡献较低。最后,这些样本的经验均值为我们提供了均值的估计,以及使用无限样本集的精确计算。
参考文献
[1]François Orieux, Jean-François Giovannelli, 和 Thomas Rodet, “贝叶斯估计正则化和点扩散函数参数用于维纳-亨特反卷积”, J. Opt. Soc. Am. A 27, 1593-1607 (2010)
https://www.osapublishing.org/josaa/abstract.cfm?URI=josaa-27-7-1593
示例
>>> from skimage import color, data, restoration >>> img = color.rgb2gray(data.astronaut()) >>> from scipy.signal import convolve2d >>> psf = np.ones((5, 5)) / 25 >>> img = convolve2d(img, psf, 'same') >>> rng = np.random.default_rng() >>> img += 0.1 * img.std() * rng.standard_normal(img.shape) >>> deconvolved_img = restoration.unsupervised_wiener(img, psf)
- skimage.restoration.unwrap_phase(image, wrap_around=False, rng=None)[源代码][源代码]#
从包裹相位图像中恢复原始图像。
从包裹在区间 [-π, π) 的图像中,恢复原始的、未包裹的图像。
- 参数:
- 图像(M[, N[, P]]) 浮点数的 ndarray 或 masked array
值应在范围 [-pi, pi) 内。如果提供了掩码数组,掩码条目将不会被更改,并且它们的值不会用于指导相邻未掩码值的展开。不允许使用掩码的 1D 数组,并且会引发 ValueError。
- wrap_around布尔值或布尔值序列,可选
当序列中的一个元素为 True 时,解包过程将认为图像沿相应轴的边缘是连接的,并使用这种连通性来指导相位解包过程。如果只给出一个布尔值,它将应用于所有轴。1D 数组不支持环绕。
- rng : {
numpy.random.Generator
, int}, 可选toctree
是一个 reStructuredText 指令 ,这是一个非常多功能的标记。指令可以有参数、选项和内容。 伪随机数生成器。默认情况下,使用 PCG64 生成器(参见
numpy.random.default_rng()
)。如果 rng 是整数,则用于为生成器设定种子。解包依赖于随机初始化。这设置了PRNG以实现确定性行为。
- 返回:
- image_unwrappedarray_like, double
与输入形状相同的未包装图像。如果输入 image 是掩码数组,掩码将被保留。
- Raises:
- ValueError
如果调用时使用的是掩码的1D数组,或者调用时使用的是1D数组且
wrap_around=True
。
参考文献
[1]Miguel Arevallilo Herraez, David R. Burton, Michael J. Lalor, 和 Munther A. Gdeisat, “基于非连续路径的可靠性排序的快速二维相位解包裹算法”, 应用光学杂志, 第41卷, 第35期 (2002) 7437,
[2]Abdul-Rahman, H., Gdeisat, M., Burton, D., & Lalor, M., “基于非连续路径可靠性排序的快速三维相位解包裹算法。在 W. Osten, C. Gorecki, & E. L. Novak (编), 光学计量学 (2005) 32–40, 国际光学与光子学学会。”
示例
>>> c0, c1 = np.ogrid[-1:1:128j, -1:1:128j] >>> image = 12 * np.pi * np.exp(-(c0**2 + c1**2)) >>> image_wrapped = np.angle(np.exp(1j * image)) >>> image_unwrapped = unwrap_phase(image_wrapped) >>> np.std(image_unwrapped - image) < 1e-6 # A constant offset is normal True
- skimage.restoration.wiener(image, psf, balance, reg=None, is_real=True, clip=True)[源代码][源代码]#
Wiener-Hunt 反卷积
使用维纳-亨特方法返回去卷积(即使用傅里叶对角化)。
- 参数:
- 图像ndarray
输入降质的图像(可以是n维的)。
- psfndarray
点扩散函数。如果数据类型是实数,则假定为脉冲响应(输入图像空间);如果数据类型是复数,则假定为传递函数(傅里叶空间)。脉冲响应的形状没有限制。传递函数的形状必须是 (N1, N2, …, ND) 如果 is_real 为 True,否则为 (N1, N2, …, ND // 2 + 1)`(参见 `np.fft.rfftn)。
- 平衡浮动
正则化参数值,用于调整数据充分性(提高频率恢复)和先验充分性(减少频率恢复以避免噪声伪影)之间的平衡。
- regndarray,可选
正则化算子。默认情况下是拉普拉斯算子。它可以是一个脉冲响应或传递函数,如同 psf 参数一样。形状约束与 psf 参数相同。
- is_real布尔值,可选
默认情况下为真。指定是否在提供
psf
和reg
时使用厄米假设,即仅提供一半的频率平面(由于实信号傅里叶变换的冗余性)。仅在psf
和/或reg
作为传递函数提供时应用。关于厄米性质,请参见uft
模块或np.fft.rfftn
。- 剪辑布尔值,可选
默认情况下为 True。如果为 True,则结果中高于 1 或低于 -1 的像素值将被阈值化,以确保与 skimage 管道的兼容性。
- 返回:
- im_deconv(M, N) ndarray
去卷积后的图像。
注释
此函数通过脉冲响应(或PSF)对噪声和退化的图像应用维纳滤波器。如果数据模型是
\[y = Hx + n\]其中 \(n\) 是噪声,\(H\) 是点扩散函数,\(x\) 是未知的原始图像,维纳滤波器是
\[\hat x = F^\dagger \left( |\Lambda_H|^2 + \lambda |\Lambda_D|^2 \right)^{-1} \Lambda_H^\dagger F y\]其中,\(F\) 和 \(F^\dagger\) 分别是傅里叶变换和逆傅里叶变换,\(\Lambda_H\) 是传递函数(或PSF的傅里叶变换,见下文[Hunt]),\(\Lambda_D\) 是用于惩罚恢复图像频率的滤波器(默认使用拉普拉斯算子,即对高频进行惩罚)。参数 \(\lambda\) 用于调节数据(倾向于增加高频,即使是来自噪声的高频)和正则化之间的平衡。
这些方法随后特定于一个先验模型。因此,应用或真实图像的性质必须对应于该先验模型。默认情况下,先验模型(拉普拉斯)引入图像平滑或像素相关性。它也可以解释为高频惩罚,以补偿解相对于数据的不稳定性(有时称为噪声放大或“爆炸性”解)。
最后,傅里叶空间的使用意味着 \(H\) 具有循环性质,参见 [2]。
参考文献
[1]François Orieux, Jean-François Giovannelli, 和 Thomas Rodet, “贝叶斯估计正则化和点扩散函数参数用于维纳-亨特反卷积”, J. Opt. Soc. Am. A 27, 1593-1607 (2010)
https://www.osapublishing.org/josaa/abstract.cfm?URI=josaa-27-7-1593
[2]B. R. Hunt “A matrix theory proof of the discrete convolution theorem”, IEEE Trans. on Audio and Electroacoustics, vol. au-19, no. 4, pp. 285-288, dec. 1971
示例
>>> from skimage import color, data, restoration >>> img = color.rgb2gray(data.astronaut()) >>> from scipy.signal import convolve2d >>> psf = np.ones((5, 5)) / 25 >>> img = convolve2d(img, psf, 'same') >>> rng = np.random.default_rng() >>> img += 0.1 * img.std() * rng.standard_normal(img.shape) >>> deconvolved_img = restoration.wiener(img, psf, 0.1)