skimage.restoration
#
图像恢复模块。
为 restoration.rolling_ball 创建球形核。 |
|
校准降噪函数并返回最优的 J 不变版本。 |
|
循环旋转(重复将 func 应用于 x 的移位版本)。 |
|
使用双边滤波器对图像进行降噪。 |
|
应用降噪函数的 J 不变版本。 |
|
对 2D-4D 灰度或 RGB 图像执行非局部均值降噪。 |
|
使用分裂 Bregman 优化执行总变差降噪。 |
|
在 nD 中执行总变差降噪。 |
|
对图像执行小波降噪。 |
|
为 restoration.rolling_ball 创建椭球核。 |
|
基于小波的鲁棒估计器,用于估计(高斯)噪声标准差。 |
|
使用双调和方程修复图像中掩蔽点的像素。 |
|
Richardson-Lucy 反卷积。 |
|
通过滚动/平移内核来估计背景强度。 |
|
无监督 Wiener-Hunt 反卷积。 |
|
从包裹相位图像中恢复原始图像。 |
|
Wiener-Hunt 反卷积 |
- skimage.restoration.ball_kernel(radius, ndim)[source]#
为 restoration.rolling_ball 创建球形核。
- 参数:
- radiusint
球体的半径。
- ndimint
球体的维度数。
ndim
应与将应用内核的图像的维度匹配。
- 返回值:
- kernelndarray
包含椭球体上半部分表面强度的内核。
另请参阅
- skimage.restoration.calibrate_denoiser(image, denoise_function, denoise_parameters, *, stride=4, approximate_loss=True, extra_output=False)[source]#
校准降噪函数并返回最优的 J 不变版本。
返回的函数使用为对输入图像进行降噪而设置的最佳参数值进行部分求值。
- 参数:
- imagendarray
要降噪的输入数据(使用 img_as_float 转换)。
- denoise_functionfunction
要校准的降噪函数。
- denoise_parametersdict of list
要校准的 denoise_function 参数范围。
- strideint, optional
在掩蔽过程中使用的步长,该掩蔽过程将 denoise_function 转换为 J 不变性。
- approximate_lossbool, optional
是否通过仅在一个掩蔽的图像版本上计算自监督损失来近似自监督损失,用于评估降噪器。如果为 False,则运行时间将是 stride**image.ndim 的倍数。
- extra_outputbool, optional
如果为 True,则除了校准的降噪函数外,还返回参数和损失
- 返回值:
- best_denoise_functionfunction
denoise_function 的最优 J 不变版本。
- 如果 extra_output 为 True,则还会返回以下元组
- (parameters_tested, losses)tuple (list of dict, list of int)
作为 kwargs 字典的 denoise_function 测试的参数列表 parameters_tested 中每一组参数的自监督损失。
注释
校准过程使用自监督均方误差损失来评估 denoise_function 的 J 不变版本的性能。自监督损失的最小化器也是地面实况损失(即真实的 MSE 误差)的最小化器 [1]。返回的函数可用于原始噪声图像或其他具有相似特征的图像。
- 增加步长会提高 best_denoise_function 的性能
但代价是增加其运行时间。它对校准的运行时间没有影响。
参考文献
[1]J. Batson & L. Royer。Noise2Self:通过自我监督进行盲降噪,国际机器学习大会,第 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)
使用 J 不变性校准降噪器使用 J 不变性校准降噪器的完整教程
- skimage.restoration.cycle_spin(x, func, max_shifts, shift_steps=1, num_workers=None, func_kw=None, *, channel_axis=None)[source]#
循环旋转(重复将 func 应用于 x 的移位版本)。
- 参数:
- xarray-like
输入到
func
的数据。- funcfunction
要应用于
x
的循环移位版本的函数。应将x
作为其第一个参数。任何其他参数都可以通过func_kw
提供。- max_shiftsint or tuple
如果为整数,则
range(0, max_shifts+1)
中的移位将用于x
的每个轴。如果为元组,则range(0, max_shifts[i]+1)
将位于轴 i 处。- shift_stepsint or tuple, optional
沿轴 i 应用的移位的步长为::
range((0, max_shifts[i]+1, shift_steps[i]))
。如果提供整数,则所有轴都使用相同的步长。- num_workersint or None, optional
在循环旋转期间要使用的并行线程数。如果设置为
None
,则使用所有可用的核心。- func_kwdict, optional
要提供给
func
的其他关键字参数。- channel_axisint or None, optional
如果为 None,则假设图像为灰度(单通道)图像。否则,此参数指示数组的哪个轴对应于通道。
版本 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 卷。施普林格,纽约,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)[source]#
使用双边滤波器对图像进行降噪。
- 参数:
- imagendarray, shape (M, N[, 3])
输入图像,2D 灰度或 RGB。
- win_sizeint
用于滤波的窗口大小。如果未指定 win_size,则计算为
max(5, 2 * ceil(3 * sigma_spatial) + 1)
。- sigma_color浮点数
灰度值/颜色距离(辐射相似性)的标准差。较大的值会导致对具有较大辐射差异的像素进行平均。如果为
None
,则将使用image
的标准差。- sigma_spatial浮点数
范围距离的标准差。较大的值会导致对具有较大空间差异的像素进行平均。
- bins整数
颜色滤波的高斯权重的离散值的数量。较大的值会导致提高精度。
- mode{'constant', 'edge', 'symmetric', 'reflect', 'wrap'}
如何处理图像边界之外的值。有关详细信息,请参阅
numpy.pad
。- cval整数或浮点数
与模式“constant”结合使用,表示图像边界之外的值。
- channel_axisint or None, optional
如果
None
,则假设图像为灰度图像(单通道)。否则,此参数指示数组的哪个轴对应于通道。版本 0.19 中新增:
channel_axis
在 0.19 中添加。
- 返回值:
- denoisedndarray
降噪后的图像。
注释
这是一种边缘保持降噪滤波器。它根据像素的空间接近度和辐射相似性 [1] 对像素进行平均。
空间接近度由两个像素之间的欧几里得距离和某个标准偏差 (sigma_spatial) 的高斯函数来衡量。
辐射相似性由两个颜色值之间的欧几里得距离和某个标准偏差 (sigma_color) 的高斯函数来衡量。
请注意,如果图像的任何 int 数据类型,
image
将使用 img_as_float 函数进行转换,因此标准偏差 (sigma_color) 将在[0, 1]
范围内。有关 scikit-image 的数据类型转换以及在这些转换中如何重新缩放图像的更多信息,请参阅: https://scikit-image.cn/docs/stable/user_guide/data_types.html。
参考文献
[1]C. Tomasi 和 R. Manduchi。“用于灰度和彩色图像的双边滤波。” IEEE 国际计算机视觉会议 (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)[source]#
应用降噪函数的 J 不变版本。
- 参数:
- imagendarray (M[, N[, …]][, C]),整数、无符号整数或浮点数类型
要降噪的输入数据。 image 可以是任何数值类型,但它会被转换为浮点数类型的 ndarray(使用 img_as_float)以计算降噪后的图像。
- denoise_functionfunction
原始降噪函数。
- strideint, optional
在掩蔽过程中使用的步长,该掩蔽过程将 denoise_function 转换为 J 不变性。
- masksndarray 列表,可选
用于计算 J 不变输出的掩码集。如果为 None,则将使用覆盖图像的完整掩码集。
- denoiser_kwargs
传递给 denoise_function 的关键字参数。
- 返回值:
- outputndarray
降噪后的图像,与 image 形状相同。
注释
如果降噪函数对每个像素的预测不依赖于原始图像中该像素的值,则该降噪函数是 J 不变的。相反,每个像素的预测可以使用图像其余部分中包含的所有相关信息,这通常非常重要。任何函数都可以使用简单的掩码过程转换为 J 不变函数,如 [1] 中所述。
只要每个像素中的噪声是独立的,J 不变降噪器的像素级误差就与噪声无关。因此,降噪图像与噪声图像之间的平均差异(自监督损失)与降噪图像与原始干净图像之间的差异(地面实况损失)相同(最多一个常数)。
这意味着可以通过仅使用噪声数据找到给定图像的最佳 J 不变降噪器,方法是选择最小化自监督损失的降噪器。
参考文献
[1]J. Batson & L. Royer。Noise2Self:通过自我监督进行盲降噪,国际机器学习大会,第 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)
使用 J 不变性校准降噪器的完整教程
- 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)[source]#
对 2D-4D 灰度或 RGB 图像执行非局部均值降噪。
- 参数:
- image2D 或 3D ndarray
要降噪的输入图像,可以是 2D 或 3D,以及灰度或 RGB(仅限于 2D 图像,请参阅
channel_axis
参数)。可以有任意数量的通道(不严格必须是 RGB)。- patch_size整数,可选
用于降噪的补丁大小。
- patch_distance整数,可选
搜索用于降噪的补丁的最大像素距离。
- h浮点数,可选
截止距离(以灰度级表示)。h 越高,接受补丁的容忍度就越高。较高的 h 会导致图像更平滑,但会以模糊特征为代价。对于标准偏差为 sigma 的高斯噪声,经验法则是选择 h 的值为 sigma 或略小于 sigma。
- fast_mode布尔值,可选
如果为 True(默认值),则使用非局部均值算法的快速版本。如果为 False,则使用非局部均值的原始版本。有关算法的更多详细信息,请参阅“注释”部分。
- sigma浮点数,可选
(高斯)噪声的标准偏差。如果提供,则会计算补丁权重的更稳健的计算,该计算会考虑预期的噪声方差(请参阅下面的“注释”)。
- preserve_range布尔值,可选
是否保留原始值范围。否则,输入图像将根据 img_as_float 的约定进行转换。另请参阅 https://scikit-image.cn/docs/dev/user_guide/data_types.html
- channel_axisint or None, optional
如果为 None,则假设图像为灰度(单通道)图像。否则,此参数指示数组的哪个轴对应于通道。
版本 0.19 中新增:
channel_axis
在 0.19 中添加。
- 返回值:
- resultndarray
降噪后的图像,与 image 形状相同。
注释
非局部均值算法非常适合对具有特定纹理的图像进行降噪。该算法的原理是将给定像素的值与其有限邻域中其他像素的值进行平均,前提是其他像素上以这些像素为中心的补丁与感兴趣像素上以该像素为中心的补丁足够相似。
在算法的原始版本 [1] 中,对应于
fast=False
,计算复杂度为image.size * patch_size ** image.ndim * patch_distance ** image.ndim
因此,更改补丁的大小或其最大距离会对计算时间产生重大影响,尤其对于 3D 图像而言。
但是,默认行为对应于
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 的最佳值取决于图像内容和噪声水平,但当 fast_mode 为 True 时,一个合理的起点是
h = 0.8 * sigma
,或者当 fast_mode 为 False 时,h = 0.6 * sigma
。参考文献
[1] (1,2)A. Buades、B. Coll 和 J-M. Morel。用于图像降噪的非局部算法。在 CVPR 2005,第 2 卷,第 60-65 页,IEEE。 DOI:10.1109/CVPR.2005.38
[2]J. Darbon、A. Cunha、T.F. Chan、S. Osher 和 G.J. Jensen,应用于电子低温显微镜的快速非局部滤波,在第 5 届 IEEE 国际生物医学成像研讨会:从纳米到宏观,2008 年,第 1331-1334 页。 DOI:10.1109/ISBI.2008.4541250
[4]A. Buades,B. Coll和J-M. Morel。非局部均值去噪。图像处理在线,2011,第1卷,第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)
用于保留纹理的非局部均值去噪使用 J 不变性校准降噪器的完整教程
- skimage.restoration.denoise_tv_bregman(image, weight=5.0, max_num_iter=100, eps=0.001, isotropic=True, *, channel_axis=None)[source]#
使用分裂 Bregman 优化执行总变差降噪。
给定 \(f\),一个噪声图像(输入数据),全变分去噪(也称为全变分正则化)旨在找到一个图像 \(u\),其全变分小于 \(f\),在 \(u\) 保持与 \(f\) 相似的约束下。这可以通过鲁丁-奥谢-法特米 (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 解决 ROF 问题的分裂 Bregman 算法的实现([1]、[2]、[3])。
- 参数:
- imagendarray
要进行去噪的输入图像(使用
img_as_float()
转换)。- weightfloat,可选
去噪权重。它等于 \(\frac{\lambda}{2}\)。因此,weight 越小,去噪效果越好(但代价是与image 的相似度降低)。
- epsfloat,可选
停止准则的容差 \(\varepsilon > 0\):当 \(\|u_n - u_{n-1}\|_2 < \varepsilon\) 时,算法停止。
- max_num_iterint,可选
用于优化的最大迭代次数。
- isotropic布尔值,可选
在各向同性 TV 去噪和各向异性 TV 去噪之间切换。
- channel_axisint or None, optional
如果
None
,则假设图像为灰度图像(单通道)。否则,此参数指示数组的哪个轴对应于通道。版本 0.19 中新增:
channel_axis
在 0.19 中添加。
- 返回值:
- undarray
降噪后的图像。
另请参阅
denoise_tv_chambolle
在 nD 中执行总变差降噪。
注释
确保为彩色图像正确设置 channel_axis 参数。
全变分去噪的原理在 [4] 中进行了说明。它涉及最小化图像的全变分,这可以粗略地描述为图像梯度范数的积分。全变分去噪倾向于产生卡通般的图像,即分段常数图像。
参考文献
[1]Tom Goldstein 和 Stanley Osher,“用于 L1 正则化问题的 Split Bregman 方法”,https://ww3.math.ucla.edu/camreport/cam08-29.pdf
[2]Pascal Getreuer,“使用 Split Bregman 的 Rudin-Osher-Fatemi 全变分去噪”于 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)[source]#
在 nD 中执行总变差降噪。
给定 \(f\),一个噪声图像(输入数据),全变分去噪(也称为全变分正则化)旨在找到一个图像 \(u\),其全变分小于 \(f\),在 \(u\) 保持与 \(f\) 相似的约束下。这可以通过鲁丁-奥谢-法特米 (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 问题。
- 参数:
- imagendarray
要进行去噪的输入图像。如果其数据类型不是浮点数,则使用
img_as_float()
转换。- weightfloat,可选
去噪权重。它等于 \(\frac{1}{\lambda}\)。因此,weight 越大,去噪效果越好(但代价是保真度降低到 image)。
- epsfloat,可选
停止准则的容差 \(\varepsilon > 0\)(与成本函数 \(E\) 的相对差的绝对值进行比较):当 \(|E_{n-1} - E_n| < \varepsilon * E_0\) 时,算法停止。
- max_num_iterint,可选
用于优化的最大迭代次数。
- channel_axisint or None, optional
如果
None
,则假设图像为灰度图像(单通道)。否则,此参数指示数组的哪个轴对应于通道。版本 0.19 中新增:
channel_axis
在 0.19 中添加。
- 返回值:
- undarray
降噪后的图像。
另请参阅
denoise_tv_bregman
使用分裂 Bregman 优化执行总变差降噪。
注释
确保为彩色图像正确设置 channel_axis 参数。
全变分去噪的原理在 [2] 中进行了说明。它涉及最小化图像的全变分,这可以粗略地描述为图像梯度范数的积分。全变分去噪倾向于产生卡通般的图像,即分段常数图像。
参考文献
[1]A. Chambolle,全变分最小化算法及其应用,数学图像与视觉杂志,施普林格,2004,20,89-97。
示例
宇航员图像的二维示例
>>> 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)[source]#
对图像执行小波降噪。
- 参数:
- imagendarray (M[, N[, …P]][, C]) 整数、无符号整数或浮点数
要进行去噪的输入数据。 image 可以是任何数值类型,但在计算去噪图像时会被转换为浮点数类型的 ndarray。
- sigmafloat 或 list,可选
计算小波细节系数阈值时使用的噪声标准差。当为 None(默认值)时,噪声标准差通过 [2] 中的方法进行估计。
- wavelet字符串,可选
要执行的小波类型,可以是
pywt.wavelist
输出的任何选项。默认值为 ‘db1’。例如,wavelet
可以是{'db2', 'haar', 'sym9'}
等中的任何一个。- mode{'soft','hard'},可选
一个可选参数,用于选择执行的去噪类型。需要注意的是,在存在加性噪声的情况下选择软阈值可以找到原始图像的最佳近似值。
- wavelet_levelsint 或 None,可选
要使用的小波分解级别数。默认值为可能的最大分解级别数减三。
- convert2ycbcrbool,可选
如果为 True 且 channel_axis 设置,则在 YCbCr 色彩空间而不是 RGB 色彩空间中执行小波去噪。这通常会导致 RGB 图像的性能更好。
- method{'BayesShrink','VisuShrink'},可选
要使用的阈值方法。当前支持的方法包括“BayesShrink” [1] 和“VisuShrink” [2]。默认为“BayesShrink”。
- rescale_sigmabool,可选
如果为 False,则不会对用户提供的
sigma
进行重新缩放。默认值为True
,如果图像在内部重新缩放,则会适当地重新缩放 sigma。版本 0.16 中新增:
rescale_sigma
在 0.16 版本中引入- channel_axisint or None, optional
如果
None
,则假设图像为灰度图像(单通道)。否则,此参数指示数组的哪个轴对应于通道。版本 0.19 中新增:
channel_axis
在 0.19 中添加。
- 返回值:
- outndarray
降噪后的图像。
注释
小波域是图像的稀疏表示,可以认为类似于傅里叶变换的频域。稀疏表示的大多数值为零或接近零,并且真正的随机噪声(通常)由小波域中的许多小值表示。将所有低于某个阈值的值设置为 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 Transactions on 9.9 (2000):1532-1546。DOI:10.1109/83.862633
[2] (1,2,3)D. L. Donoho 和 I. M. Johnstone。“通过小波收缩实现理想的空间自适应。”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)
使用 J 不变性校准降噪器对图片进行降噪移位不变小波降噪小波去噪使用 J 不变性校准降噪器的完整教程
- skimage.restoration.ellipsoid_kernel(shape, intensity)[source]#
为 restoration.rolling_ball 创建椭球核。
- 参数:
- shape类数组
椭球体主轴的长度(不包括强度轴)。内核需要与它将应用到的图像具有相同的维数。
- intensityint
椭球体强度轴的长度。
- 返回值:
- kernelndarray
包含椭球体上半部分表面强度的内核。
另请参阅
使用滚动球算法估计背景强度
- skimage.restoration.estimate_sigma(image, average_sigmas=False, *, channel_axis=None)[source]#
基于小波的鲁棒估计器,用于估计(高斯)噪声标准差。
- 参数:
- imagendarray
要估计噪声标准偏差的图像。
- average_sigmasbool,可选
如果为真,则平均 sigma 的通道估计值。否则返回与每个通道对应的 sigma 列表。
- channel_axisint or None, optional
如果
None
,则假设图像为灰度图像(单通道)。否则,此参数指示数组的哪个轴对应于通道。版本 0.19 中新增:
channel_axis
在 0.19 中添加。
- 返回值:
- sigmafloat 或列表
估计的噪声标准偏差。如果 multichannel 为 True 且 average_sigmas 为 False,则返回每个通道的单独噪声估计值。否则,返回各个通道估计值的平均值。
注释
此函数假设噪声服从高斯分布。估计算法基于小波细节系数的中值绝对偏差,如 [1] 的第 4.2 节所述。
参考文献
[1]D. L. Donoho 和 I. M. Johnstone。“通过小波收缩实现理想的空间自适应。”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)[source]#
使用双调和方程修复图像中掩蔽点的像素。
- 参数:
- image(M[, N[, …, P]][, C]) ndarray
输入图像。
- mask(M[, N[, …, P]]) ndarray
要进行修复的像素数组。必须与“图像”通道之一具有相同的形状。未知像素必须用 1 表示,已知像素用 0 表示。
- split_into_regions布尔值,可选
如果为 True,则在区域的基础上执行修复。这可能会更慢,但内存需求会减少。
- channel_axisint or None, optional
如果为 None,则假设图像为灰度(单通道)图像。否则,此参数指示数组的哪个轴对应于通道。
版本 0.19 中新增:
channel_axis
在 0.19 中添加。
- 返回值:
- out(M[, N[, …, P]][, C]) ndarray
已修复掩码像素的输入图像。
参考文献
[1]S.B.Damelin 和 N.S.Hoang。“关于双调和函数的表面补全和图像修复:数值方面”,国际数学与数学科学杂志,第 2018 卷,文章 ID 3950312 DOI:10.1155/2018/3950312
[2]C. K. Chui 和 H. N. Mhaskar,MRA 流形上平滑函数的上下文恢复扩展,Appl. 和 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)[source]#
Richardson-Lucy 反卷积。
- 参数:
- imagendarray
输入降级图像(可以是 n 维的)。
- psfndarray
点扩散函数。
- num_iterint,可选
迭代次数。此参数起正则化的作用。
- clip布尔值,可选
默认为 True。如果为真,则结果的像素值高于 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)[source]#
通过滚动/平移内核来估计背景强度。
此滚动球算法在曝光不均匀的情况下估计 ndimage 的背景强度。它是常用滚动球算法 [1] 的推广。
- 参数:
- imagendarray
要过滤的图像。
- radiusint,可选
要滚动/平移到图像中的球形内核的半径。如果
kernel = None
,则使用此值。- kernelndarray,可选
要滚动/平移到图像中的内核。它必须与
image
具有相同的维数。内核填充该位置内核的强度。- nansafe:bool,可选
如果
False
(默认值)则假设image
中的任何值都不是np.nan
,并使用更快的实现。- num_threads:int,可选
要使用的线程最大数量。如果
None
,则使用 OpenMP 默认值;通常等于虚拟内核的最大数量。注意:这是线程数量的上限。确切数量由系统的 OpenMP 库决定。
- 返回值:
- backgroundndarray
图像的估计背景。
注释
对于其背景强度已估计的像素(不妨设为
center
),滚动球方法在其下方将kernel
居中,并提升内核直至表面在某个pos=(y,x)
处接触图像阴影。然后使用该位置处的图像强度 (image[pos]
) 加上kernel[center] - kernel[pos]
的差值来估计背景强度。此算法假设暗像素对应于背景。如果您有明亮的背景,请在将其传递给函数之前反转图像,例如,使用utils.invert。有关详细信息,请参阅图库示例。
此算法对噪声(特别是椒盐噪声)敏感。如果这在您的图像中是一个问题,您可以在将图像传递给此函数之前应用轻微的高斯平滑。
此算法的复杂度是半径的多项式,其次数等于图像维度(二维图像是 N^2,三维图像是 N^3,依此类推),因此随着半径增长到 30 或更大,它可能需要很长时间([2],[3])。它是一个精确的 N 维计算;如果您只需要近似值,则可以考虑使用更快的选项,例如顶帽滤波[4]或降采样然后上采样以减小处理的输入的大小。
参考文献
[1]Sternberg, Stanley R. “Biomedical image processing.” Computer 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)[source]#
无监督 Wiener-Hunt 反卷积。
返回使用维纳-亨特方法的反卷积,其中超参数会自动估计。该算法是在下面引用的参考文献中描述的随机迭代过程(吉布斯采样器)。另请参见
wiener
函数。- 参数:
- image(M, N) ndarray
输入降质图像。
- psfndarray
脉冲响应(输入图像的空间)或传递函数(傅里叶空间)。两者都被接受。传递函数会自动识别为复数(
np.iscomplexobj(psf)
)。- regndarray, optional
正则化算子。默认为拉普拉斯算子。它可以是脉冲响应或传递函数,与 psf 相同。
- user_paramsdict, optional
吉布斯采样器的参数字典。见下文。
- clip布尔值,可选
默认为 True。如果为 True,则结果中大于 1 或小于 -1 的像素值将被阈值化,以实现 skimage 管道的兼容性。
- rng{
numpy.random.Generator
, int}, optional 伪随机数生成器。默认情况下,使用 PCG64 生成器(请参见
numpy.random.default_rng()
)。如果rng是整数,则将其用于播种生成器。在版本 0.19 中添加。
- 返回值:
- x_postmean(M, N) ndarray
反卷积图像(后验均值)。
- chainsdict
键
noise
和prior
分别包含噪声和先验精度的链列表。
- 其他参数:
- ``user_params`` 的键为
- thresholdfloat
停止准则:两次连续近似解(对象样本的经验均值,参见注释部分)之间的差的范数。默认为 1e-4。
- burninint
要忽略的样本数,以开始计算均值。默认为 15。
- min_num_iterint
最小迭代次数。默认为 30。
- max_num_iterint
如果未满足
threshold
,则最大迭代次数。默认为 200。- callbackcallable (None by default)
用户提供的可调用对象,如果该函数存在,则将当前图像样本传递给该可调用对象以用于任何目的。用户可以存储样本,或计算除均值之外的其他矩。它对算法执行没有影响,仅用于检查。
注释
估计的图像是概率定律(来自贝叶斯分析)的后验均值。均值定义为所有可能图像的总和,并以其各自的概率加权。鉴于问题的规模,精确的求和是难以处理的。此算法使用 MCMC 在后验定律下绘制图像。实际的想法是仅绘制概率较高的图像,因为它们对均值有最大的贡献。相反,概率较低的图像绘制的次数较少,因为它们的贡献较低。最后,这些样本的经验均值使我们能够估计均值,以及使用无限样本集进行精确计算。
参考文献
[1]François Orieux、Jean-François Giovannelli 和 Thomas Rodet,“Bayesian estimation of regularization and point spread function parameters for Wiener-Hunt deconvolution”,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)[source]#
从包裹相位图像中恢复原始图像。
从包裹在区间 [-pi, pi) 内的图像中,恢复原始的、展开的图像。
- 参数:
- image(M[, N[, P]]) ndarray 或浮点数的掩码数组
这些值应在 [-pi, pi) 范围内。如果提供了掩码数组,则不会更改掩码条目,并且它们的值不会用于指导相邻未掩码值的展开。不允许使用掩码一维数组,否则将引发ValueError。
- wrap_aroundbool 或 bool 序列,可选
当序列的一个元素为True时,展开过程将认为图像沿相应轴的边缘是连接的,并使用此连接性来指导相位展开过程。如果只给出一个布尔值,它将应用于所有轴。一维数组不支持环绕。
- rng{
numpy.random.Generator
, int}, optional 伪随机数生成器。默认情况下,使用 PCG64 生成器(请参见
numpy.random.default_rng()
)。如果rng是整数,则将其用于播种生成器。展开依赖于随机初始化。这将设置要使用的 PRNG 以实现确定性行为。
- 返回值:
- image_unwrappedarray_like, double
与输入形状相同的展开图像。如果输入image是掩码数组,则将保留掩码。
- 引发:
- ValueError
如果使用掩码一维数组调用,或者使用一维数组并使用
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)[source]#
Wiener-Hunt 反卷积
返回使用维纳-亨特方法(即使用傅里叶对角化)的反卷积。
- 参数:
- imagendarray
输入降级图像(可以是 n 维的)。
- psfndarray
点扩散函数。如果数据类型为实数,则假定其为脉冲响应(输入图像空间),如果数据类型为复数,则假定其为传递函数(傅里叶空间)。脉冲响应的形状没有约束。如果is_real 为 True,则传递函数必须为(N1, N2, …, ND)形状,否则为(N1, N2, …, ND // 2 + 1)形状(请参见np.fft.rfftn)。
- balancefloat
正则化参数值,用于调整数据充分性(提高频率恢复)和先验充分性(减少频率恢复以避免噪声伪影)之间的平衡。
- regndarray, optional
正则化算子。默认为拉普拉斯算子。它可以是脉冲响应或传递函数,与 psf 相同。形状约束与psf参数相同。
- is_realboolean, optional
默认为 True。指定是否使用厄米特假设提供
psf
和reg
,即仅提供频率平面的二分之一(由于实信号傅里叶变换的冗余性)。仅当psf
和/或reg
作为传递函数提供时才适用。有关厄米特属性,请参见uft
模块或np.fft.rfftn
。- clip布尔值,可选
默认为 True。如果为 True,则结果中大于 1 或小于 -1 的像素值将被阈值化,以实现 skimage 管道的兼容性。
- 返回值:
- im_deconv(M, N) ndarray
反卷积后的图像。
注释
此函数通过脉冲响应(或 PSF)将维纳滤波器应用于噪声和降质图像。如果数据模型为
\[y = Hx + n\]其中\(n\)是噪声,\(H\)是 PSF,\(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\) 表示传递函数(或点扩散函数的傅里叶变换,参见下面的 [Hunt]),\(\Lambda_D\) 表示用于惩罚恢复图像频率的滤波器(默认情况下为拉普拉斯算子,即惩罚高频)。参数 \(\lambda\) 调节数据(倾向于增加高频,即使来自噪声的高频)和正则化之间的平衡。
这些方法特定于先验模型。因此,应用或真实图像的性质必须与先验模型相对应。默认情况下,先验模型(拉普拉斯算子)引入图像平滑度或像素相关性。它也可以解释为高频惩罚,以补偿解相对于数据的不稳定性(有时称为噪声放大或“爆炸”解)。
最后,使用傅里叶空间意味着 \(H\) 具有循环特性,参见 [2]。
参考文献
[1]François Orieux、Jean-François Giovannelli 和 Thomas Rodet,“Bayesian estimation of regularization and point spread function parameters for Wiener-Hunt deconvolution”,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)