skimage.filters#

锐化、边缘检测、秩滤波器、阈值处理等。

apply_hysteresis_threshold

image 应用迟滞阈值处理。

butterworth

应用巴特沃斯滤波器来增强高频或低频特征。

correlate_sparse

计算 padded_arraykernel 的有效互相关。

difference_of_gaussians

查找大小在 low_sigmahigh_sigma 之间的特征。

farid

使用 Farid 变换查找边缘幅度。

farid_h

使用 Farid 变换查找图像的水平边缘。

farid_v

使用 Farid 变换查找图像的垂直边缘。

filter_forward

将给定滤波器应用于数据。

filter_inverse

反向将滤波器应用于给定数据。

frangi

使用 Frangi 血管性滤波器对图像进行滤波。

gabor

返回对 Gabor 滤波器的实部和虚部响应。

gabor_kernel

返回复数 2D Gabor 滤波器核。

gaussian

多维高斯滤波器。

hessian

使用混合 Hessian 滤波器对图像进行滤波。

laplace

使用拉普拉斯算子查找图像的边缘。

median

返回图像的局部中值。

meijering

使用 Meijering 神经元性滤波器对图像进行滤波。

prewitt

使用 Prewitt 变换查找边缘幅度。

prewitt_h

使用 Prewitt 变换查找图像的水平边缘。

prewitt_v

使用 Prewitt 变换查找图像的垂直边缘。

rank_order

返回形状相同的图像,其中每个像素是 image 的唯一值的升序排序中像素值的索引,也称为秩序值。

roberts

使用 Roberts' 交叉算子查找边缘幅度。

roberts_neg_diag

使用 Roberts' 交叉算子查找图像的交叉边缘。

roberts_pos_diag

使用 Roberts' 交叉算子查找图像的交叉边缘。

sato

使用 Sato 管状性滤波器对图像进行滤波。

scharr

使用 Scharr 变换查找边缘幅度。

scharr_h

使用 Scharr 变换查找图像的水平边缘。

scharr_v

使用 Scharr 变换查找图像的垂直边缘。

sobel

使用 Sobel 滤波器查找图像中的边缘。

sobel_h

使用 Sobel 变换查找图像的水平边缘。

sobel_v

使用 Sobel 变换查找图像的垂直边缘。

threshold_isodata

根据 ISODATA 方法返回阈值。

threshold_li

通过 Li 的迭代最小交叉熵方法计算阈值。

threshold_local

根据局部像素邻域计算阈值掩码图像。

threshold_mean

根据灰度值的平均值返回阈值。

threshold_minimum

根据最小值方法返回阈值。

threshold_multiotsu

生成 classes-1 个阈值,以按照 Otsu 的多类方法划分 image 中的灰度级。

threshold_niblack

将 Niblack 局部阈值应用于数组。

threshold_otsu

根据 Otsu 方法返回阈值。

threshold_sauvola

将 Sauvola 局部阈值应用于数组。

threshold_triangle

根据三角形算法返回阈值。

threshold_yen

根据 Yen 的方法返回阈值。

try_all_threshold

返回比较不同阈值处理方法输出的图形。

unsharp_mask

反锐化掩模滤波器。

wiener

最小均方误差 (维纳) 逆滤波器。

window

返回给定大小和维度的 n 维窗口。

LPIFilter2D

线性位置不变滤波器 (二维)

rank


skimage.filters.apply_hysteresis_threshold(image, low, high)[源代码]#

image 应用迟滞阈值处理。

此算法查找 image 大于 highimage 大于 low 该区域连接到大于 high 的区域的区域。

参数:
image(M[, …]) ndarray

灰度输入图像。

lowfloat,或与 image 形状相同的数组

较低阈值。

highfloat,或与 image 形状相同的数组

较高阈值。

返回:
thresholded(M[, …]) bool 数组

数组,其中 True 表示 image 高于迟滞阈值的位置。

参考文献

[1]

J. Canny. 边缘检测的计算方法。 IEEE Transactions on Pattern Analysis and Machine Intelligence. 1986; vol. 8, pp.679-698. DOI:10.1109/TPAMI.1986.4767851

示例

>>> image = np.array([1, 2, 3, 2, 1, 2, 1, 3, 2])
>>> apply_hysteresis_threshold(image, 1.5, 2.5).astype(int)
array([0, 1, 1, 1, 0, 0, 0, 1, 1])

迟滞阈值处理

迟滞阈值处理

使用像素图查找对象的测地中心

使用像素图查找对象的测地中心

skimage.filters.butterworth(image, cutoff_frequency_ratio=0.005, high_pass=True, order=2.0, channel_axis=None, *, squared_butterworth=True, npad=0)[源代码]#

应用巴特沃斯滤波器来增强高频或低频特征。

此滤波器在频域中定义。

参数:
image(M[, N[, …, P]][, C]) ndarray

输入图像。

cutoff_frequency_ratiofloat,可选

确定相对于 FFT 形状的截止位置。接收 [0, 0.5] 之间的值。

high_passbool,可选

是否执行高通滤波。如果为 False,则执行低通滤波。

orderfloat,可选

影响截止点附近斜率的滤波器阶数。阶数越高,频率空间中的斜率越陡峭。

channel_axisint,可选

如果存在通道维度,请在此处提供索引。如果为 None (默认),则所有轴都假定为空间维度。

squared_butterworthbool,可选

如果为 True,则使用巴特沃斯滤波器的平方。有关更多详细信息,请参阅下面的注释。

npadint,可选

使用 numpy.padmode='edge' 扩展将图像的每个边缘填充 npad 个像素。

返回:
resultndarray

巴特沃斯滤波后的图像。

注释

带通滤波器可以通过组合高通滤波器和低通滤波器来实现。如果出现明显的边界伪影,用户可以增加 npad

图像处理教科书(例如 [1][2])中使用的“巴特沃斯滤波器”通常是由 [3][4] 描述的传统巴特沃斯滤波器的平方。如果 squared_butterworth 设置为 True,则将在此处使用平方版本。低通情况下,平方巴特沃斯滤波器由以下表达式给出:

\[H_{low}(f) = \frac{1}{1 + \left(\frac{f}{c f_s}\right)^{2n}}\]

高通情况下由下式给出:

\[H_{hi}(f) = 1 - H_{low}(f)\]

其中 \(f=\sqrt{\sum_{d=0}^{\mathrm{ndim}} f_{d}^{2}}\) 是空间频率的绝对值,\(f_s\) 是采样频率,\(c\)cutoff_frequency_ratio\(n\) 是滤波器 order [1]。当 squared_butterworth=False 时,则使用上述表达式的平方根。

请注意,cutoff_frequency_ratio 是根据采样频率 \(f_s\) 定义的。FFT 频谱覆盖奈奎斯特范围(\([-f_s/2, f_s/2]\)),因此 cutoff_frequency_ratio 的值应介于 0 和 0.5 之间。当 squared_butterworth 为 true 时,截止频率处的频率响应(增益)为 0.5,当为 false 时为 \(1/\sqrt{2}\)

参考文献

[1] (1,2)

Russ, John C., et al. The Image Processing Handbook, 3rd. Ed. 1999, CRC Press, LLC.

[2]

Birchfield, Stan. Image Processing and Analysis. 2018. Cengage Learning.

[3]

Butterworth, Stephen. “On the theory of filter amplifiers.” Wireless Engineer 7.6 (1930): 536-541.

示例

分别对灰度和彩色图像应用高通和低通巴特沃斯滤波器

>>> from skimage.data import camera, astronaut
>>> from skimage.filters import butterworth
>>> high_pass = butterworth(camera(), 0.07, True, 8)
>>> low_pass = butterworth(astronaut(), 0.01, False, 4, channel_axis=-1)

巴特沃斯滤波器

巴特沃斯滤波器

skimage.filters.correlate_sparse(image, kernel, mode='reflect')[source]#

计算 padded_arraykernel 的有效互相关。

kernel 很大且有很多零时,此函数速度很快

有关互相关的描述,请参见 scipy.ndimage.correlate

参数:
imagendarray,dtype 为 float,形状为 (M, N[, …], P)

输入数组。如果 mode 为 'valid',则此数组应已填充,因为将剥离与内核形状相同的边距。

kernelndarray,dtype 为 float,形状为 (Q, R[, …], S)

要相关的内核。必须与 padded_array 具有相同的维度数。为了获得高性能,它应该是稀疏的(只有少量非零条目)。

modestring,可选

有关有效模式,请参阅 scipy.ndimage.correlate。 此外,接受模式 'valid',在这种情况下,不应用填充,结果是内核完全位于原始数据内的较小图像的结果。

返回:
resultfloat 数组,形状为 (M, N[, …], P)

imagekernel 互相关的结果。如果使用模式 'valid',则结果形状为 (M-Q+1, N-R+1[, …], P-S+1)。


skimage.filters.difference_of_gaussians(image, low_sigma, high_sigma=None, *, mode='nearest', cval=0, channel_axis=None, truncate=4.0)[source]#

查找大小在 low_sigmahigh_sigma 之间的特征。

此函数使用高斯差分方法将带通滤波器应用于多维数组。输入数组使用两个具有不同 sigma 的高斯核进行模糊处理,以产生两个中间的滤波图像。然后,从较少模糊的图像中减去较模糊的图像。因此,最终输出图像将具有由较小 sigma 高斯衰减的高频分量,并且由于它们存在于较模糊的中间图像中,低频分量将被去除。

参数:
imagendarray

要过滤的输入数组。

low_sigma标量或标量序列

具有较小 sigma 的高斯核在所有轴上的标准差。标准差以序列形式给出每个轴,或者以单个数字形式给出,在这种情况下,该单个数字用作所有轴的标准差值。

high_sigma标量或标量序列,可选(默认为 None)

具有较大 sigma 的高斯核在所有轴上的标准差。标准差以序列形式给出每个轴,或者以单个数字形式给出,在这种情况下,该单个数字用作所有轴的标准差值。如果为 None(默认),则所有轴的 sigma 计算为 1.6 * low_sigma。

mode{‘reflect’,‘constant’,‘nearest’,‘mirror’,‘wrap’},可选

mode 参数确定如何处理数组边界,其中 cval 是 mode 等于 “constant” 时的值。默认为“nearest”。

cval标量,可选

如果 mode 为“constant”,则填充超出输入边缘的值。默认为 0.0

channel_axisint 或 None,可选

如果为 None,则假定图像为灰度(单通道)图像。否则,此参数指示数组的哪个轴对应于通道。

在 0.19 版本中添加:在 0.19 中添加了 channel_axis

truncatefloat,可选(默认为 4.0)

在此标准差数处截断过滤器。

返回:
filtered_imagendarray

滤波后的数组。

注释

此函数将从使用由 high_sigma 给出的 sigma 的高斯核滤波的数组中减去使用由 low_sigma 提供的 sigma 的高斯核滤波的数组。 high_sigma 的值必须始终大于或等于 low_sigma 中的对应值,否则将引发 ValueError

high_sigma 为 None 时,high_sigma 的值将计算为 low_sigma 中对应值的 1.6 倍。该比率最初由 Marr 和 Hildreth (1980) [1] 提出,并且通常用于近似高斯的反拉普拉斯算子,该算子用于边缘和斑点检测。

输入图像根据 img_as_float 的约定进行转换。

除了 sigma 值外,所有参数都用于两个滤波器。

参考文献

[1]

Marr, D. and Hildreth, E. Theory of Edge Detection. Proc. R. Soc. Lond. Series B 207, 187-217 (1980). https://doi.org/10.1098/rspb.1980.0020

示例

将简单的高斯差分滤波器应用于彩色图像

>>> from skimage.data import astronaut
>>> from skimage.filters import difference_of_gaussians
>>> filtered_image = difference_of_gaussians(astronaut(), 2, 10,
...                                          channel_axis=-1)

应用由高斯差分滤波器近似的拉普拉斯高斯滤波器

>>> filtered_image = difference_of_gaussians(astronaut(), 2,
...                                          channel_axis=-1)

使用每个轴不同的 sigma 值将高斯差分滤波器应用于灰度图像

>>> from skimage.data import camera
>>> filtered_image = difference_of_gaussians(camera(), (2,5), (3,20))

使用极坐标和对数极坐标变换进行配准

使用极坐标和对数极坐标变换进行配准

通过高斯差分进行带通滤波

通过高斯差分进行带通滤波

skimage.filters.farid(image, mask=None, *, axis=None, mode='reflect', cval=0.0)[source]#

使用 Farid 变换查找边缘幅度。

参数:
image数组

输入图像。

mask布尔值数组,可选

将输出图像裁剪到此掩码。(mask=0 的值将设置为 0。)

axisint 或 int 序列,可选

计算沿此轴的边缘滤波器。如果未提供,则计算边缘幅度。定义为

farid_mag = np.sqrt(sum([farid(image, axis=i)**2
                         for i in range(image.ndim)]) / image.ndim)

如果 axis 是序列,也会计算幅度。

modestr 或 str 序列,可选

卷积的边界模式。有关模式的描述,请参阅 scipy.ndimage.convolve。这可以是单个边界模式或每个轴一个边界模式。

cvalfloat,可选

mode'constant' 时,这是在图像数据边界之外的值中使用的常量。

返回:
输出浮点数数组

Farid 边缘图。

另请参阅

farid_h, farid_v

水平和垂直边缘检测。

scharr, sobel, prewitt, skimage.feature.canny

注释

取水平和垂直导数平方和的平方根,得到一个对方向不敏感的幅度。 与 Scharr 算子类似,此算子采用旋转不变性约束设计。

参考文献

[1]

Farid, H. and Simoncelli, E. P., “离散多维信号的微分”,IEEE Transactions on Image Processing 13(4): 496-508, 2004。 DOI:10.1109/TIP.2004.823819

[2]

维基百科,“Farid 和 Simoncelli 导数”。 可在以下网址获取:<https://en.wikipedia.org/wiki/Image_derivatives#Farid_and_Simoncelli_Derivatives>

示例

>>> from skimage import data
>>> camera = data.camera()
>>> from skimage import filters
>>> edges = filters.farid(camera)

skimage.filters.farid_h(image, *, mask=None)[源代码]#

使用 Farid 变换查找图像的水平边缘。

参数:
image二维数组

要处理的图像。

mask二维数组,可选

一个可选的掩码,用于限制应用程序到特定区域。 请注意,遮罩区域周围的像素也被遮罩,以防止遮罩区域影响结果。

返回:
输出二维数组

Farid 边缘图。

注释

该内核是使用 [1] 中的 5 抽头权重构造的。

参考文献

[1]

Farid, H. and Simoncelli, E. P., “离散多维信号的微分”,IEEE Transactions on Image Processing 13(4): 496-508, 2004。 DOI:10.1109/TIP.2004.823819

[2]

Farid, H. 和 Simoncelli, E. P. “最优旋转等变定向导数内核”,In: 第 7 届计算机图像和模式分析国际会议,德国基尔。 1997 年 9 月。

边缘算子

边缘算子

skimage.filters.farid_v(image, *, mask=None)[源代码]#

使用 Farid 变换查找图像的垂直边缘。

参数:
image二维数组

要处理的图像。

mask二维数组,可选

一个可选的掩码,用于限制应用程序到特定区域。 请注意,遮罩区域周围的像素也被遮罩,以防止遮罩区域影响结果。

返回:
输出二维数组

Farid 边缘图。

注释

该内核是使用 [1] 中的 5 抽头权重构造的。

参考文献

[1]

Farid, H. and Simoncelli, E. P., “离散多维信号的微分”,IEEE Transactions on Image Processing 13(4): 496-508, 2004。 DOI:10.1109/TIP.2004.823819

边缘算子

边缘算子

skimage.filters.filter_forward(data, impulse_response=None, filter_params=None, predefined_filter=None)[源代码]#

将给定滤波器应用于数据。

参数:
data(M, N) ndarray

输入数据。

impulse_response可调用 f(r, c, **filter_params)

滤波器的脉冲响应。 请参阅 LPIFilter2D.__init__。

filter_params字典,可选

脉冲响应函数的其他关键字参数。

其他参数:
predefined_filterLPIFilter2D

如果您需要在不同的图像上多次应用相同的过滤器,请构造 LPIFilter2D 并在此处指定。

示例

未标准化的 Gaussian 滤波器

>>> def filt_func(r, c, sigma=1):
...     return np.exp(-(r**2 + c**2)/(2 * sigma**2))
>>>
>>> from skimage import data
>>> filtered = filter_forward(data.coins(), filt_func)

skimage.filters.filter_inverse(data, impulse_response=None, filter_params=None, max_gain=2, predefined_filter=None)[源代码]#

反向将滤波器应用于给定数据。

参数:
data(M, N) ndarray

输入数据。

impulse_response可调用 f(r, c, **filter_params)

滤波器的脉冲响应。 请参阅 LPIFilter2D。 除非提供 predifined_filter,否则这是一个必需的参数。

filter_params字典,可选

脉冲响应函数的其他关键字参数。

max_gain浮点数,可选

限制滤波器增益。 通常,滤波器包含零,这会导致逆滤波器具有无限增益。 高增益会导致伪影放大,因此建议采用保守的限制。

其他参数:
predefined_filterLPIFilter2D,可选

如果您需要在不同的图像上多次应用相同的过滤器,请构造 LPIFilter2D 并在此处指定。


skimage.filters.frangi(image, sigmas=range(1, 10, 2), scale_range=None, scale_step=None, alpha=0.5, beta=0.5, gamma=None, black_ridges=True, mode='reflect', cval=0)[源代码]#

使用 Frangi 血管性滤波器对图像进行滤波。

此滤波器可用于检测连续的脊,例如血管、皱纹、河流。 它可用于计算包含此类对象的整个图像的比例。

仅针对二维和三维图像定义。 根据 [1] 中描述的方法计算 Hessian 矩阵的特征值,以计算图像区域与血管的相似度。

参数:
image(M, N[, P]) ndarray

包含输入图像数据的数组。

sigmas浮点数的可迭代对象,可选

用作滤波器刻度的西格玛值,即 np.arange(scale_range[0], scale_range[1], scale_step)

scale_range浮点数的二元组,可选

使用的西格玛值的范围。

scale_step浮点数,可选

西格玛值之间的步长。

alpha浮点数,可选

Frangi 校正常数,用于调整滤波器对偏离板状结构的灵敏度。

beta浮点数,可选

Frangi 校正常数,用于调整滤波器对偏离斑点状结构的灵敏度。

gamma浮点数,可选

Frangi 校正常数,用于调整滤波器对高方差/纹理/结构区域的灵敏度。 默认值 None 使用最大 Hessian 范数的一半。

black_ridges布尔值,可选

如果为 True(默认值),则滤波器检测黑色脊;如果为 False,则检测白色脊。

mode{‘constant’、‘reflect’、‘wrap’、‘nearest’、‘mirror’},可选

如何处理图像边界之外的值。

cvalfloat,可选

与模式“constant”结合使用,图像边界之外的值。

返回:
out(M, N[, P]) ndarray

经过滤波的图像(所有刻度上的像素最大值)。

另请参阅

meijering
sato
hessian

注释

此滤波器的早期版本由 Marc Schrijver(2001 年 11 月)、D. J. Kroon, University of Twente(2009 年 5 月)[2] 和 D. G. Ellis(2017 年 1 月)[3] 实现。

参考文献

[1]

Frangi, A. F., Niessen, W. J., Vincken, K. L., & Viergever, M. A. (1998,). 多尺度血管增强滤波。 在国际医学图像计算和计算机辅助干预会议上(第 130-137 页)。 施普林格出版社。 DOI:10.1007/BFb0056195

[2]

Kroon, D. J.: 基于 Hessian 的 Frangi 血管性滤波器。

[3]

Ellis, D. G.: ellisdg/frangi3d

脊算子

脊算子

skimage.filters.gabor(image, frequency, theta=0, bandwidth=1, sigma_x=None, sigma_y=None, n_stds=3, offset=0, mode='reflect', cval=0)[源代码]#

返回对 Gabor 滤波器的实部和虚部响应。

Gabor 滤波器内核的实部和虚部应用于图像,响应以数组对的形式返回。

Gabor 滤波器是具有 Gaussian 内核的线性滤波器,该内核由正弦平面波调制。 Gabor 滤波器的频率和方向表示类似于人类视觉系统的表示。 Gabor 滤波器组常用于计算机视觉和图像处理。 它们特别适合于边缘检测和纹理分类。

参数:
image二维数组

输入图像。

频率 (frequency)浮点数 (float)

谐波函数的空间频率。以像素为单位指定。

角度 (theta)浮点数 (float), 可选

以弧度为单位的方向。如果为 0,则谐波函数在 x 方向上。

带宽 (bandwidth)浮点数 (float), 可选

滤波器捕获的带宽。对于固定带宽,sigma_xsigma_y 将随着频率的增加而减小。如果用户设置了 sigma_xsigma_y,则忽略此值。

sigma_x, sigma_y浮点数 (float), 可选

x 和 y 方向上的标准差。这些方向适用于旋转之前的内核。如果 theta = pi/2,则内核旋转 90 度,以便 sigma_x 控制垂直方向。

n_stds标量 (scalar), 可选

内核的线性大小是 n_stds(默认为 3)个标准差。

偏移量 (offset)浮点数 (float), 可选

以弧度为单位的谐波函数的相位偏移。

模式 (mode){‘constant’, ‘nearest’, ‘reflect’, ‘mirror’, ‘wrap’}, 可选

用于将图像与内核进行卷积的模式,传递给 ndi.convolve

cval标量,可选

如果卷积的 mode 为“constant”,则填充输入边缘的值。该参数传递给 ndi.convolve

返回:
实部, 虚部 (real, imag)数组 (arrays)

使用 Gabor 滤波器内核的实部和虚部进行滤波的图像。图像的尺寸与输入图像相同。

参考文献

示例

>>> from skimage.filters import gabor
>>> from skimage import data
>>> from matplotlib import pyplot as plt  
>>> image = data.coins()
>>> # detecting edges in a coin image
>>> filt_real, filt_imag = gabor(image, frequency=0.6)
>>> fix, ax = plt.subplots()  
>>> ax.imshow(filt_real)      
>>> plt.show()                
>>> # less sensitivity to finer details with the lower frequency kernel
>>> filt_real, filt_imag = gabor(image, frequency=0.1)
>>> fig, ax = plt.subplots()  
>>> ax.imshow(filt_real)      
>>> plt.show()                

skimage.filters.gabor_kernel(frequency, theta=0, bandwidth=1, sigma_x=None, sigma_y=None, n_stds=3, offset=0, dtype=<class 'numpy.complex128'>)[source]#

返回复数 2D Gabor 滤波器核。

Gabor 内核是由复谐波函数调制的 Gaussian 内核。谐波函数由虚部正弦函数和实部余弦函数组成。空间频率与谐波的波长以及 Gaussian 内核的标准差成反比。带宽也与标准差成反比。

参数:
频率 (frequency)浮点数 (float)

谐波函数的空间频率。以像素为单位指定。

角度 (theta)浮点数 (float), 可选

以弧度为单位的方向。如果为 0,则谐波函数在 x 方向上。

带宽 (bandwidth)浮点数 (float), 可选

滤波器捕获的带宽。对于固定带宽,sigma_xsigma_y 将随着频率的增加而减小。如果用户设置了 sigma_xsigma_y,则忽略此值。

sigma_x, sigma_y浮点数 (float), 可选

x 和 y 方向上的标准差。这些方向适用于旋转之前的内核。如果 theta = pi/2,则内核旋转 90 度,以便 sigma_x 控制垂直方向。

n_stds标量 (scalar), 可选

内核的线性大小是 n_stds(默认为 3)个标准差

偏移量 (offset)浮点数 (float), 可选

以弧度为单位的谐波函数的相位偏移。

数据类型 (dtype){np.complex64, np.complex128}

指定滤波器是单精度复数还是双精度复数。

返回:
g复数数组 (complex array)

复数滤波器内核。

参考文献

示例

>>> from skimage.filters import gabor_kernel
>>> from matplotlib import pyplot as plt  
>>> gk = gabor_kernel(frequency=0.2)
>>> fig, ax = plt.subplots()  
>>> ax.imshow(gk.real)        
>>> plt.show()                
>>> # more ripples (equivalent to increasing the size of the
>>> # Gaussian spread)
>>> gk = gabor_kernel(frequency=0.2, bandwidth=0.1)
>>> fig, ax = plt.suplots()  
>>> ax.imshow(gk.real)       
>>> plt.show()               

用于纹理分类的 Gabor 滤波器组

用于纹理分类的 Gabor 滤波器组

skimage.filters.gaussian(image, sigma=1, *, mode='nearest', cval=0, preserve_range=False, truncate=4.0, channel_axis=None, out=None)[source]#

多维高斯滤波器。

参数:
imagendarray

要滤波的输入图像(灰度或彩色)。

标准差 (sigma)标量或标量序列 (scalar or sequence of scalars), 可选

Gaussian 内核的标准差。Gaussian 滤波器的标准差以序列形式给出每个轴,或以单个数字给出,在这种情况下,所有轴都相等。

mode{‘reflect’,‘constant’,‘nearest’,‘mirror’,‘wrap’},可选

mode 参数确定如何处理数组边界,其中 cval 是 mode 等于 “constant” 时的值。默认为“nearest”。

cval标量,可选

如果 mode 为“constant”,则填充超出输入边缘的值。默认为 0.0

保留范围 (preserve_range)布尔值 (bool), 可选

如果为 True,则保留原始值范围。否则,将根据 img_as_float 的约定转换输入 image(首先根据输入的数据类型归一化为 [-1.0 ; 1.0] 或 [0 ; 1.0] 的值)。

有关详细信息,请参阅:https://scikit-image.cn/docs/dev/user_guide/data_types.html

截断 (truncate)浮点数 (float), 可选

在此标准差数处截断过滤器。

channel_axisint 或 None,可选

如果为 None,则假定图像为灰度(单通道)图像。否则,此参数指示数组的哪个轴对应于通道。

在版本 0.19 中添加: channel_axis 在 0.19 中添加。

输出 (out)ndarray, 可选

如果给定,滤波后的图像将存储在此数组中。

在版本 0.23 中添加: out 在 0.23 中添加。

返回:
filtered_imagendarray

滤波后的数组

注释

此函数是 scipy.ndimage.gaussian_filter() 的包装器。

整数数组转换为浮点数。

out 应该是浮点数据类型,因为 gaussian 将输入 image 转换为浮点数。如果未提供 out,则将分配另一个数组并将其作为结果返回。

多维滤波器实现为一系列一维卷积滤波器。中间数组以与输出相同的数据类型存储。因此,对于精度有限的输出类型,由于中间结果可能以不足的精度存储,因此结果可能不精确。

示例

>>> import skimage as ski
>>> a = np.zeros((3, 3))
>>> a[1, 1] = 1
>>> a
array([[0., 0., 0.],
       [0., 1., 0.],
       [0., 0., 0.]])
>>> ski.filters.gaussian(a, sigma=0.4)  # mild smoothing
array([[0.00163116, 0.03712502, 0.00163116],
       [0.03712502, 0.84496158, 0.03712502],
       [0.00163116, 0.03712502, 0.00163116]])
>>> ski.filters.gaussian(a, sigma=1)  # more smoothing
array([[0.05855018, 0.09653293, 0.05855018],
       [0.09653293, 0.15915589, 0.09653293],
       [0.05855018, 0.09653293, 0.05855018]])
>>> # Several modes are possible for handling boundaries
>>> ski.filters.gaussian(a, sigma=1, mode='reflect')
array([[0.08767308, 0.12075024, 0.08767308],
       [0.12075024, 0.16630671, 0.12075024],
       [0.08767308, 0.12075024, 0.08767308]])
>>> # For RGB images, each is filtered separately
>>> image = ski.data.astronaut()
>>> filtered_img = ski.filters.gaussian(image, sigma=1, channel_axis=-1)

主动轮廓模型

主动轮廓模型

使用简单的图像拼接组装图像

使用简单的图像拼接组装图像

共定位指标

共定位指标

跟踪金属合金的凝固

跟踪金属合金的凝固

测量核膜上的荧光强度

测量核膜上的荧光强度

skimage.filters.hessian(image, sigmas=range(1, 10, 2), scale_range=None, scale_step=None, alpha=0.5, beta=0.5, gamma=15, black_ridges=True, mode='reflect', cval=0)[source]#

使用混合 Hessian 滤波器对图像进行滤波。

此滤波器可用于检测连续边缘,例如血管、皱纹、河流。它可用于计算包含此类对象的整个图像的比例。

仅针对 2-D 和 3-D 图像定义。与 Frangi 滤波器几乎相同,但使用替代的平滑方法。请参阅 [1] 以查找 Frangi 和 Hessian 滤波器之间的差异。

参数:
image(M, N[, P]) ndarray

包含输入图像数据的数组。

sigmas浮点数的可迭代对象,可选

用作滤波器刻度的西格玛值,即 np.arange(scale_range[0], scale_range[1], scale_step)

scale_range浮点数的二元组,可选

使用的西格玛值的范围。

scale_step浮点数,可选

西格玛值之间的步长。

beta浮点数,可选

Frangi 校正常数,用于调整滤波器对偏离斑点状结构的灵敏度。

gamma浮点数,可选

Frangi 校正常数,用于调整滤波器对高方差/纹理/结构区域的灵敏度。

black_ridges布尔值,可选

如果为 True(默认值),则滤波器检测黑色脊;如果为 False,则检测白色脊。

mode{‘constant’、‘reflect’、‘wrap’、‘nearest’、‘mirror’},可选

如何处理图像边界之外的值。

cvalfloat,可选

与模式“constant”结合使用,图像边界之外的值。

返回:
out(M, N[, P]) ndarray

经过滤波的图像(所有刻度上的像素最大值)。

另请参阅

meijering
sato
frangi

注释

由 Marc Schrijver(2001 年 11 月)编写,由 D. J. Kroon Twente 大学(2009 年 5 月)重新编写 [2]

参考文献

[1]

Ng, C. C., Yap, M. H., Costen, N., & Li, B. (2014,). 使用混合 Hessian 滤波器进行自动皱纹检测。在亚洲计算机视觉会议中(第 609-622 页)。施普林格国际出版社。DOI:10.1007/978-3-319-16811-1_40

[2]

Kroon, D. J.: 基于 Hessian 的 Frangi 血管性滤波器。

脊算子

脊算子

skimage.filters.laplace(image, ksize=3, mask=None)[source]#

使用拉普拉斯算子查找图像的边缘。

参数:
imagendarray

要处理的图像。

ksize整数 (int), 可选

定义离散拉普拉斯算子的大小,使其大小为 (ksize,) * image.ndim。

掩码 (mask)ndarray, 可选

一个可选的掩码,用于限制应用程序到特定区域。 请注意,遮罩区域周围的像素也被遮罩,以防止遮罩区域影响结果。

返回:
输出 (output)ndarray

拉普拉斯边缘图。

注释

拉普拉斯算子使用函数 skimage.restoration.uft.laplacian() 生成。


skimage.filters.median(image, footprint=None, out=None, mode='nearest', cval=0.0, behavior='ndimage')[source]#

返回图像的局部中值。

参数:
图像 (image)类数组 (array-like)

输入图像。

footprintndarray, 可选

如果 behavior=='rank', footprint 是一个由 1 和 0 组成的二维数组。如果 behavior=='ndimage', footprint 是一个与 image 具有相同维度的由 1 和 0 组成的 N 维数组。如果为 None,则 footprint 将是一个每个维度有 3 个元素的 N 维数组(例如,向量、正方形、立方体等)。

outndarray, (与 image 具有相同的数据类型), 可选

如果为 None,则会分配一个新的数组。

mode{‘reflect’, ‘constant’, ‘nearest’, ‘mirror’,’‘wrap’}, 可选

mode 参数决定如何处理数组边界,其中 cval 是当 mode 等于 ‘constant’ 时的值。默认为 ‘nearest’。

在版本 0.15 中添加:behavior='ndimage' 时使用 mode

cval标量,可选

如果 mode 为 ‘constant’,则填充输入边缘外的值。默认为 0.0

在版本 0.15 中添加:0.15 版本中添加了 cval,当 behavior='ndimage' 时使用。

behavior{‘ndimage’, ‘rank’}, 可选

选择使用旧的行为(即 < 0.15)还是新行为。旧的行为会调用 skimage.filters.rank.median()。新的行为会调用 scipy.ndimage.median_filter()。默认为 ‘ndimage’。

在版本 0.15 中添加:0.15 版本引入了 behavior

在版本 0.16 中更改:默认的 behavior 已从 ‘rank’ 更改为 ‘ndimage’。

返回:
out二维数组(与输入图像具有相同的数据类型)

输出图像。

另请参阅

skimage.filters.rank.median

基于秩的中值滤波实现,为无符号整数图像提供更多灵活性和附加参数。

示例

>>> from skimage import data
>>> from skimage.morphology import disk
>>> from skimage.filters import median
>>> img = data.camera()
>>> med = median(img, disk(5))

skimage.filters.meijering(image, sigmas=range(1, 10, 2), alpha=None, black_ridges=True, mode='reflect', cval=0)[source]#

使用 Meijering 神经元性滤波器对图像进行滤波。

此滤波器可用于检测连续的脊线,例如神经突、皱纹、河流。它可以用于计算包含此类对象的整个图像的比例。

根据 [1] 中描述的方法,计算 Hessian 矩阵的特征值,以计算图像区域与神经突的相似度。

参数:
image(M, N[, …]) ndarray

包含输入图像数据的数组。

sigmas浮点数的可迭代对象,可选

用作滤波器比例的 sigmas 值

alpha浮点数,可选

塑造滤波器常数,选择最平坦的细长特征。默认值 None 选择最佳值 -1/(ndim+1)。

black_ridges布尔值,可选

如果为 True(默认值),则滤波器检测黑色脊;如果为 False,则检测白色脊。

mode{‘constant’、‘reflect’、‘wrap’、‘nearest’、‘mirror’},可选

如何处理图像边界之外的值。

cvalfloat,可选

与模式“constant”结合使用,图像边界之外的值。

返回:
out(M, N[, …]) ndarray

经过滤波的图像(所有刻度上的像素最大值)。

另请参阅

sato
frangi
hessian

参考文献

[1]

Meijering, E., Jacob, M., Sarria, J. C., Steiner, P., Hirling, H., Unser, M. (2004). Design and validation of a tool for neurite tracing and analysis in fluorescence microscopy images. Cytometry Part A, 58(2), 167-176. DOI:10.1002/cyto.a.20022

脊算子

脊算子

skimage.filters.prewitt(image, mask=None, *, axis=None, mode='reflect', cval=0.0)[source]#

使用 Prewitt 变换查找边缘幅度。

参数:
image数组

输入图像。

mask布尔值数组,可选

将输出图像裁剪到此掩码。(mask=0 的值将设置为 0。)

axisint 或 int 序列,可选

计算沿此轴的边缘滤波器。如果未提供,则计算边缘幅度。定义为

prw_mag = np.sqrt(sum([prewitt(image, axis=i)**2
                       for i in range(image.ndim)]) / image.ndim)

如果 axis 是序列,也会计算幅度。

modestr 或 str 序列,可选

卷积的边界模式。有关模式的描述,请参阅 scipy.ndimage.convolve。这可以是单个边界模式或每个轴一个边界模式。

cvalfloat,可选

mode'constant' 时,这是在图像数据边界之外的值中使用的常量。

返回:
输出浮点数数组

Prewitt 边缘图。

另请参阅

prewitt_h, prewitt_v

水平和垂直边缘检测。

sobel, scharr, farid, skimage.feature.canny

注释

由于 Prewitt 算子对梯度算子的近似不是完全旋转不变的,因此边缘幅度在边缘方向上略有不同。为了获得更好的旋转不变性,应该使用 Scharr 算子。Sobel 算子比 Prewitt 算子具有更好的旋转不变性,但旋转不变性不如 Scharr 算子。

示例

>>> from skimage import data
>>> from skimage import filters
>>> camera = data.camera()
>>> edges = filters.prewitt(camera)

边缘算子

边缘算子

skimage.filters.prewitt_h(image, mask=None)[source]#

使用 Prewitt 变换查找图像的水平边缘。

参数:
image二维数组

要处理的图像。

mask二维数组,可选

一个可选的掩码,用于限制应用程序到特定区域。 请注意,遮罩区域周围的像素也被遮罩,以防止遮罩区域影响结果。

返回:
输出二维数组

Prewitt 边缘图。

注释

我们使用以下内核

 1/3   1/3   1/3
  0     0     0
-1/3  -1/3  -1/3

边缘算子

边缘算子

skimage.filters.prewitt_v(image, mask=None)[source]#

使用 Prewitt 变换查找图像的垂直边缘。

参数:
image二维数组

要处理的图像。

mask二维数组,可选

一个可选的掩码,用于限制应用程序到特定区域。 请注意,遮罩区域周围的像素也被遮罩,以防止遮罩区域影响结果。

返回:
输出二维数组

Prewitt 边缘图。

注释

我们使用以下内核

1/3   0  -1/3
1/3   0  -1/3
1/3   0  -1/3

边缘算子

边缘算子

skimage.filters.rank_order(image)[source]#

返回形状相同的图像,其中每个像素是 image 的唯一值的升序排序中像素值的索引,也称为秩序值。

参数:
imagendarray
返回:
labels无符号整数的 ndarray,形状与 image.shape 相同

新数组,其中每个像素都具有 image 中相应像素的秩次值。像素值介于 0 和 n - 1 之间,其中 n 是 image 中不同的唯一值的数量。此数组的数据类型将由 np.min_scalar_type(image.size) 决定。

original_values一维 ndarray

image 的唯一原始值。这将与 image 具有相同的数据类型。

示例

>>> a = np.array([[1, 4, 5], [4, 4, 1], [5, 1, 1]])
>>> a
array([[1, 4, 5],
       [4, 4, 1],
       [5, 1, 1]])
>>> rank_order(a)
(array([[0, 1, 2],
       [1, 1, 0],
       [2, 0, 0]], dtype=uint8), array([1, 4, 5]))
>>> b = np.array([-1., 2.5, 3.1, 2.5])
>>> rank_order(b)
(array([0, 1, 2, 1], dtype=uint8), array([-1. ,  2.5,  3.1]))

skimage.filters.roberts(image, mask=None)[source]#

使用 Roberts 交叉算子查找边缘幅度。

参数:
image二维数组

要处理的图像。

mask二维数组,可选

一个可选的掩码,用于限制应用程序到特定区域。 请注意,遮罩区域周围的像素也被遮罩,以防止遮罩区域影响结果。

返回:
输出二维数组

Roberts 交叉边缘图。

另请参阅

roberts_pos_diag, roberts_neg_diag

对角线边缘检测。

sobel, scharr, prewitt, skimage.feature.canny

示例

>>> from skimage import data
>>> camera = data.camera()
>>> from skimage import filters
>>> edges = filters.roberts(camera)

边缘算子

边缘算子

skimage.filters.roberts_neg_diag(image, mask=None)[source]#

使用 Roberts 交叉算子查找图像的交叉边缘。

将内核应用于输入图像,以产生一个方向上的梯度分量的单独测量值。

参数:
image二维数组

要处理的图像。

mask二维数组,可选

一个可选的掩码,用于限制应用程序到特定区域。 请注意,遮罩区域周围的像素也被遮罩,以防止遮罩区域影响结果。

返回:
输出二维数组

Robert 的边缘图。

注释

我们使用以下内核

 0   1
-1   0

skimage.filters.roberts_pos_diag(image, mask=None)[source]#

使用 Roberts 交叉算子查找图像的交叉边缘。

将内核应用于输入图像,以产生一个方向上的梯度分量的单独测量值。

参数:
image二维数组

要处理的图像。

mask二维数组,可选

一个可选的掩码,用于限制应用程序到特定区域。 请注意,遮罩区域周围的像素也被遮罩,以防止遮罩区域影响结果。

返回:
输出二维数组

Robert 的边缘图。

注释

我们使用以下内核

1   0
0  -1

skimage.filters.sato(image, sigmas=range(1, 10, 2), black_ridges=True, mode='reflect', cval=0)[源代码]#

使用 Sato 管状性滤波器对图像进行滤波。

此滤波器可用于检测连续的脊,例如管道、皱纹、河流。它可用于计算包含此类物体的整个图像的比例。

仅为 2-D 和 3-D 图像定义。根据 [1] 中描述的方法,计算 Hessian 的特征值以计算图像区域与管的相似度。

参数:
image(M, N[, P]) ndarray

包含输入图像数据的数组。

sigmas浮点数的可迭代对象,可选

用作滤波器尺度的 Sigmas。

black_ridges布尔值,可选

如果为 True(默认值),则滤波器检测黑色脊;如果为 False,则检测白色脊。

mode{‘constant’、‘reflect’、‘wrap’、‘nearest’、‘mirror’},可选

如何处理图像边界之外的值。

cvalfloat,可选

与模式“constant”结合使用,图像边界之外的值。

返回:
out(M, N[, P]) ndarray

经过滤波的图像(所有刻度上的像素最大值)。

另请参阅

meijering
frangi
hessian

参考文献

[1]

Sato, Y., Nakajima, S., Shiraga, N., Atsumi, H., Yoshida, S., Koller, T., …, Kikinis, R. (1998). 三维多尺度线滤波器,用于医学图像中曲线结构的分割和可视化。医学图像分析,2(2), 143-168。 DOI:10.1016/S1361-8415(98)80009-1

脊算子

脊算子

使用像素图查找对象的测地中心

使用像素图查找对象的测地中心

skimage.filters.scharr(image, mask=None, *, axis=None, mode='reflect', cval=0.0)[源代码]#

使用 Scharr 变换查找边缘幅度。

参数:
image数组

输入图像。

mask布尔值数组,可选

将输出图像裁剪到此掩码。(mask=0 的值将设置为 0。)

axisint 或 int 序列,可选

计算沿此轴的边缘滤波器。如果未提供,则计算边缘幅度。定义为

sch_mag = np.sqrt(sum([scharr(image, axis=i)**2
                       for i in range(image.ndim)]) / image.ndim)

如果 axis 是序列,也会计算幅度。

modestr 或 str 序列,可选

卷积的边界模式。有关模式的描述,请参阅 scipy.ndimage.convolve。这可以是单个边界模式或每个轴一个边界模式。

cvalfloat,可选

mode'constant' 时,这是在图像数据边界之外的值中使用的常量。

返回:
输出浮点数数组

Scharr 边缘图。

另请参阅

scharr_h, scharr_v

水平和垂直边缘检测。

sobel, prewitt, farid, skimage.feature.canny

注释

与其他边缘滤波器(如 Sobel 或 Prewitt 算子)相比,Scharr 算子具有更好的旋转不变性。

参考文献

[1]

D. Kroon, 2009, Short Paper University Twente, 基于核的图像导数的数值优化。

示例

>>> from skimage import data
>>> from skimage import filters
>>> camera = data.camera()
>>> edges = filters.scharr(camera)

边缘算子

边缘算子

skimage.filters.scharr_h(image, mask=None)[源代码]#

使用 Scharr 变换查找图像的水平边缘。

参数:
image二维数组

要处理的图像。

mask二维数组,可选

一个可选的掩码,用于限制应用程序到特定区域。 请注意,遮罩区域周围的像素也被遮罩,以防止遮罩区域影响结果。

返回:
输出二维数组

Scharr 边缘图。

注释

我们使用以下内核

 3   10   3
 0    0   0
-3  -10  -3

参考文献

[1]

D. Kroon, 2009, Short Paper University Twente, 基于核的图像导数的数值优化。

边缘算子

边缘算子

skimage.filters.scharr_v(image, mask=None)[源代码]#

使用 Scharr 变换查找图像的垂直边缘。

参数:
image二维数组

要处理的图像

mask二维数组,可选

一个可选的掩码,用于限制应用程序到特定区域。 请注意,遮罩区域周围的像素也被遮罩,以防止遮罩区域影响结果。

返回:
输出二维数组

Scharr 边缘图。

注释

我们使用以下内核

 3   0   -3
10   0  -10
 3   0   -3

参考文献

[1]

D. Kroon, 2009, Short Paper University Twente, 基于核的图像导数的数值优化。

边缘算子

边缘算子

skimage.filters.sobel(image, mask=None, *, axis=None, mode='reflect', cval=0.0)[源代码]#

使用 Sobel 滤波器查找图像中的边缘。

参数:
image数组

输入图像。

mask布尔值数组,可选

将输出图像裁剪到此掩码。(mask=0 的值将设置为 0。)

axisint 或 int 序列,可选

计算沿此轴的边缘滤波器。如果未提供,则计算边缘幅度。定义为

sobel_mag = np.sqrt(sum([sobel(image, axis=i)**2
                         for i in range(image.ndim)]) / image.ndim)

如果 axis 是序列,也会计算幅度。

modestr 或 str 序列,可选

卷积的边界模式。有关模式的描述,请参阅 scipy.ndimage.convolve。这可以是单个边界模式或每个轴一个边界模式。

cvalfloat,可选

mode'constant' 时,这是在图像数据边界之外的值中使用的常量。

返回:
输出浮点数数组

Sobel 边缘图。

另请参阅

sobel_h, sobel_v

水平和垂直边缘检测。

scharr, prewitt, farid, skimage.feature.canny

参考文献

[1]

D. Kroon, 2009, Short Paper University Twente, 基于核的图像导数的数值优化。

示例

>>> from skimage import data
>>> from skimage import filters
>>> camera = data.camera()
>>> edges = filters.sobel(camera)

将灰度滤波器适配到 RGB 图像

将灰度滤波器适配到 RGB 图像

边缘算子

边缘算子

迟滞阈值处理

迟滞阈值处理

基于区域边界的区域邻接图 (RAG)

基于区域边界的区域邻接图 (RAG)

使用紧凑的分水岭查找规则分割

使用紧凑的分水岭查找规则分割

在不重叠的情况下扩展分割标签

在不重叠的情况下扩展分割标签

分割和超像素算法的比较

分割和超像素算法的比较

查找两个分割的交集

查找两个分割的交集

区域边界 RAG 的分层合并

区域边界 RAG 的分层合并

洪水填充

洪水填充

评估分割指标

评估分割指标

比较基于边缘和基于区域的分割

比较基于边缘和基于区域的分割

skimage.filters.sobel_h(image, mask=None)[源代码]#

使用 Sobel 变换查找图像的水平边缘。

参数:
image二维数组

要处理的图像。

mask二维数组,可选

一个可选的掩码,用于限制应用程序到特定区域。 请注意,遮罩区域周围的像素也被遮罩,以防止遮罩区域影响结果。

返回:
输出二维数组

Sobel 边缘图。

注释

我们使用以下内核

 1   2   1
 0   0   0
-1  -2  -1

边缘算子

边缘算子

skimage.filters.sobel_v(image, mask=None)[源代码]#

使用 Sobel 变换查找图像的垂直边缘。

参数:
image二维数组

要处理的图像。

mask二维数组,可选

一个可选的掩码,用于限制应用程序到特定区域。 请注意,遮罩区域周围的像素也被遮罩,以防止遮罩区域影响结果。

返回:
输出二维数组

Sobel 边缘图。

注释

我们使用以下内核

1   0  -1
2   0  -2
1   0  -1

边缘算子

边缘算子

skimage.filters.threshold_isodata(image=None, nbins=256, return_all=False, *, hist=None)[源代码]#

根据 ISODATA 方法返回阈值。

基于直方图的阈值,称为 Ridler-Calvard 方法或均值间值。返回的阈值满足以下等式

threshold = (image[image <= threshold].mean() +
             image[image > threshold].mean()) / 2.0

也就是说,返回的阈值是强度,它将图像分成两组像素,其中阈值强度位于这两组的平均强度之间。

对于整数图像,上述等式在 1 以内成立;对于浮点图像,等式在直方图 bin 宽度内成立。

必须提供 image 或 hist。如果提供 hist,则忽略图像的实际直方图。

参数:
image(M, N[, …]) ndarray

灰度输入图像。

nbinsint,可选

用于计算直方图的 bin 数。此值对于整数数组将被忽略。

return_allbool,可选

如果为 False(默认值),则仅返回满足上述等式的最低阈值。如果为 True,则返回所有有效阈值。

hist数组或数组的 2 元组,可选

从中确定阈值的直方图和相应的 bin 中心强度数组。或者,只能传递直方图。

返回:
thresholdfloat 或 int 或 array

阈值。

参考文献

[1]

Ridler, TW & Calvard, S (1978), “使用迭代选择方法的图像阈值化” IEEE Transactions on Systems, Man and Cybernetics 8: 630-632, DOI:10.1109/TSMC.1978.4310039

[2]

Sezgin M. 和 Sankur B. (2004) “图像阈值技术和定量性能评估的调查” Journal of Electronic Imaging, 13(1): 146-165, http://www.busim.ee.boun.edu.tr/~sankur/SankurFolder/Threshold_survey.pdf DOI:10.1117/1.1631315

[3]

ImageJ AutoThresholder 代码, http://fiji.sc/wiki/index.php/Auto_Threshold

示例

>>> from skimage.data import coins
>>> image = coins()
>>> thresh = threshold_isodata(image)
>>> binary = image > thresh

skimage.filters.threshold_li(image, *, tolerance=None, initial_guess=None, iter_callback=None)[源代码]#

通过 Li 的迭代最小交叉熵方法计算阈值。

参数:
image(M, N[, …]) ndarray

灰度输入图像。

tolerancefloat,可选

当一次迭代中阈值的变化小于此值时,完成计算。默认情况下,这是 image 中强度值之间最小差异的一半。

initial_guessfloat 或 Callable[[array[float]], float],可选

Li 的迭代方法使用梯度下降来找到最优阈值。如果图像强度直方图包含两个以上的模式(峰值),梯度下降可能会陷入局部最优。迭代的初始猜测可以帮助算法找到全局最优阈值。浮点数值定义了一个特定的起始点,而可调用对象应该接受图像强度数组并返回一个浮点数值。有效的可调用对象示例包括 numpy.mean (默认), lambda arr: numpy.quantile(arr, 0.95), 甚至 skimage.filters.threshold_otsu()

iter_callbackCallable[[float], Any], 可选

一个函数,它将在算法的每次迭代中被调用并传入阈值。

返回:
thresholdfloat

上限阈值。所有强度高于此值的像素都被假定为前景。

参考文献

[1]

Li C.H. 和 Lee C.K. (1993) “最小交叉熵阈值”模式识别,26(4): 617-625 DOI:10.1016/0031-3203(93)90115-D

[2]

Li C.H. 和 Tam P.K.S. (1998) “最小交叉熵阈值的迭代算法”模式识别快报,18(8): 771-776 DOI:10.1016/S0167-8655(98)00057-9

[3]

Sezgin M. 和 Sankur B. (2004) “图像阈值技术和定量性能评估综述”电子成像杂志,13(1): 146-165 DOI:10.1117/1.1631315

[4]

ImageJ AutoThresholder 代码, http://fiji.sc/wiki/index.php/Auto_Threshold

示例

>>> from skimage.data import camera
>>> image = camera()
>>> thresh = threshold_li(image)
>>> binary = image > thresh

移除对象

移除对象

Li 阈值法

Li 阈值法

skimage.filters.threshold_local(image, block_size=3, method='gaussian', offset=0, mode='reflect', param=None, cval=0)[source]#

根据局部像素邻域计算阈值掩码图像。

也称为自适应或动态阈值处理。阈值是像素局部邻域的加权平均值减去一个常数。或者,可以使用 ‘generic’ 方法,通过给定函数动态确定阈值。

参数:
image(M, N[, …]) ndarray

灰度输入图像。

block_sizeint 或 int 序列

用于计算阈值的像素邻域的奇数大小(例如 3、5、7、…、21、…)。

method{‘generic’, ‘gaussian’, ‘mean’, ‘median’}, 可选

用于确定加权平均图像中局部邻域的自适应阈值的方法。

  • ‘generic’: 使用自定义函数(参见 param 参数)

  • ‘gaussian’: 应用高斯滤波器(有关自定义 sigma 值,请参见 param 参数)

  • ‘mean’: 应用算术平均滤波器

  • ‘median’: 应用中值排序滤波器

默认情况下,使用 ‘gaussian’ 方法。

偏移量 (offset)浮点数 (float), 可选

从邻域的加权平均值中减去的常数,用于计算局部阈值。默认偏移量为 0。

mode{‘reflect’,‘constant’,‘nearest’,‘mirror’,‘wrap’},可选

mode 参数确定如何处理数组边界,其中 cval 是 mode 等于 ‘constant’ 时的值。默认为 ‘reflect’。

param{int, function}, 可选

指定 ‘gaussian’ 方法的 sigma 值,或指定 ‘generic’ 方法的函数对象。此函数将局部邻域的扁平数组作为单个参数,并返回中心像素的计算阈值。

cvalfloat,可选

如果 mode 为 ‘constant’,则填充输入边缘的值。

返回:
threshold(M, N[, …]) ndarray

阈值图像。输入图像中所有高于阈值图像中相应像素的像素都被视为前景。

参考文献

[1]

Gonzalez, R. C. 和 Wood, R. E. “数字图像处理(第二版)。”Prentice-Hall Inc.,2002:600–612。ISBN:0-201-18075-8

示例

>>> from skimage.data import camera
>>> image = camera()[:50, :50]
>>> binary_image1 = image > threshold_local(image, 15, 'mean')
>>> func = lambda arr: arr.mean()
>>> binary_image2 = image > threshold_local(image, 15, 'generic',
...                                         param=func)

用修复技术恢复有斑点的角膜图像

用修复技术恢复有斑点的角膜图像

阈值处理

阈值处理

skimage.filters.threshold_mean(image)[source]#

根据灰度值的平均值返回阈值。

参数:
image(M, N[, …]) ndarray

灰度输入图像。

返回:
thresholdfloat

上限阈值。所有强度高于此值的像素都被假定为前景。

参考文献

[1]

C. A. Glasbey,“基于直方图的阈值算法分析”,CVGIP:图形模型和图像处理,第 55 卷,第 532-537 页,1993 年。 DOI:10.1006/cgip.1993.1040

示例

>>> from skimage.data import camera
>>> image = camera()
>>> thresh = threshold_mean(image)
>>> binary = image > thresh

阈值处理

阈值处理

skimage.filters.threshold_minimum(image=None, nbins=256, max_num_iter=10000, *, hist=None)[source]#

根据最小值方法返回阈值。

如果未提供,则计算输入 image 的直方图,并对其进行平滑处理,直到只剩下两个最大值。然后,两者之间的最小值是阈值。

必须提供 image 或 hist。如果提供 hist,则忽略图像的实际直方图。

参数:
image(M, N[, …]) ndarray, 可选

灰度输入图像。

nbinsint,可选

用于计算直方图的 bin 数。此值对于整数数组将被忽略。

max_num_iterint, 可选

平滑直方图的最大迭代次数。

hist数组或数组的 2 元组,可选

从中确定阈值的直方图和相应的 bin 中心强度数组。或者,只能传递直方图。

返回:
thresholdfloat

上限阈值。所有强度高于此值的像素都被假定为前景。

引发:
RuntimeError

如果无法在直方图中找到两个局部最大值,或者平滑处理花费超过 1e4 次迭代。

参考文献

[1]

C. A. Glasbey,“基于直方图的阈值算法分析”,CVGIP:图形模型和图像处理,第 55 卷,第 532-537 页,1993 年。

[2]

Prewitt, JMS & Mendelsohn, ML (1966), “细胞图像的分析”, 纽约科学院年报 128: 1035-1053 DOI:10.1111/j.1749-6632.1965.tb11715.x

示例

>>> from skimage.data import camera
>>> image = camera()
>>> thresh = threshold_minimum(image)
>>> binary = image > thresh

阈值处理

阈值处理

跟踪金属合金的凝固

跟踪金属合金的凝固

skimage.filters.threshold_multiotsu(image=None, classes=3, nbins=256, *, hist=None)[source]#

生成 classes-1 个阈值,按照 Otsu 的多类方法划分 image 中的灰度级。

选择阈值是为了最大化阈值灰度级类之间成对方差的总和。有关更多详细信息,请参见注释和 [1]

必须提供图像或直方图。如果提供了直方图,则忽略图像的实际直方图。

参数:
image(M, N[, …]) ndarray, 可选

灰度输入图像。

classesint, 可选

要进行阈值处理的类数,即生成的区域数。

nbinsint,可选

用于计算直方图的 bin 的数量。此值对于整数数组被忽略。

hist数组或数组的 2 元组,可选

从中确定阈值的直方图,以及可选的对应 bin 中心强度数组。如果没有提供直方图,此函数将从图像中计算它(参见注释)。

返回:
thresh数组

包含所需类的阈值的数组。

引发:
ValueError

如果 image 包含的灰度值少于所需的类数。

注释

此实现依赖于一个 Cython 函数,其复杂度为 \(O\left(\frac{Ch^{C-1}}{(C-1)!}\right)\),其中 \(h\) 是直方图 bin 的数量,\(C\) 是所需的类数。

如果未给出直方图,此函数将使用 skimage.exposure.histogram,其行为与 np.histogram 不同。虽然两者都允许,但请使用前者以保持一致的行为。

输入图像必须是灰度图像。

参考文献

[1]

Liao, P-S., Chen, T-S. 和 Chung, P-C.,“多级阈值的快速算法”,信息科学与工程杂志 17 (5): 713-727, 2001。可在以下网址获得:<https://ftp.iis.sinica.edu.tw/JISE/2001/200109_01.pdf> DOI:10.6688/JISE.2001.17.5.1

[2]

Tosa, Y.,“多重 Otsu 阈值”,ImageJ 的 Java 插件。可在以下网址获得:<http://imagej.net/plugins/download/Multi_OtsuThreshold.java>

示例

>>> from skimage.color import label2rgb
>>> from skimage import data
>>> image = data.camera()
>>> thresholds = threshold_multiotsu(image)
>>> regions = np.digitize(image, bins=thresholds)
>>> regions_colorized = label2rgb(regions)

多重 Otsu 阈值处理

多重 Otsu 阈值处理

使用像素图查找对象的测地中心

使用像素图查找对象的测地中心

分割人体细胞(有丝分裂中)

分割人体细胞(有丝分裂中)

skimage.filters.threshold_niblack(image, window_size=15, k=0.2)[源代码]#

将 Niblack 局部阈值应用于数组。

使用以下公式为图像中的每个像素计算阈值 T

T = m(x,y) - k * s(x,y)

其中 m(x,y) 和 s(x,y) 是像素 (x,y) 的邻域的均值和标准差,该邻域由以像素为中心的 w 乘以 w 大小的矩形窗口定义。k 是一个可配置的参数,用于衡量标准差的影响。

参数:
image(M, N[, …]) ndarray

灰度输入图像。

window_sizeint,或 int 的可迭代对象,可选

窗口大小,指定为单个奇数整数 (3, 5, 7, …),或者长度为 image.ndim 的可迭代对象,其中只包含奇数整数 (例如 (1, 5, 5))。

kfloat,可选

阈值公式中参数 k 的值。

返回:
threshold(M, N[, …]) ndarray

阈值掩码。所有强度高于此值的像素都被认为是前景。

注释

该算法最初是为文本识别而设计的。

Bradley 阈值是 Niblack 阈值的一个特例,等效于

>>> from skimage import data
>>> image = data.page()
>>> q = 1
>>> threshold_image = threshold_niblack(image, k=0) * q

对于某个值 q。默认情况下,Bradley 和 Roth 使用 q=1

参考文献

[1]

W. Niblack,《数字图像处理导论》,Prentice-Hall,1986 年。

[2]

D. Bradley 和 G. Roth,“使用积分图像的自适应阈值化”,《图形工具杂志》12(2),第 13-21 页,2007 年。DOI:10.1080/2151237X.2007.10129236

示例

>>> from skimage import data
>>> image = data.page()
>>> threshold_image = threshold_niblack(image, window_size=7, k=0.1)

Niblack 和 Sauvola 阈值化

Niblack 和 Sauvola 阈值化

skimage.filters.threshold_otsu(image=None, nbins=256, *, hist=None)[源代码]#

根据 Otsu 方法返回阈值。

必须提供图像或直方图。如果提供了直方图,则忽略图像的实际直方图。

参数:
image(M, N[, …]) ndarray, 可选

灰度输入图像。

nbinsint,可选

用于计算直方图的 bin 数。此值对于整数数组将被忽略。

hist数组或数组的 2 元组,可选

从中确定阈值的直方图,以及可选的对应的 bin 中心强度数组。如果未提供 hist,则此函数将从图像计算它。

返回:
thresholdfloat

上限阈值。所有强度高于此值的像素都被假定为前景。

注释

输入图像必须是灰度图像。

参考文献

示例

>>> from skimage.data import camera
>>> image = camera()
>>> thresh = threshold_otsu(image)
>>> binary = image <= thresh

阈值处理

阈值处理

Niblack 和 Sauvola 阈值化

Niblack 和 Sauvola 阈值化

标记图像区域

标记图像区域

测量区域属性

测量区域属性

共定位指标

共定位指标

阈值处理

阈值处理

测量核膜上的荧光强度

测量核膜上的荧光强度

排序滤波器

排序滤波器

skimage.filters.threshold_sauvola(image, window_size=15, k=0.2, r=None)[源代码]#

将 Sauvola 局部阈值应用于数组。Sauvola 是 Niblack 技术的修改版。

在原始方法中,使用以下公式为图像中的每个像素计算阈值 T

T = m(x,y) * (1 + k * ((s(x,y) / R) - 1))

其中 m(x,y) 和 s(x,y) 是像素 (x,y) 的邻域的均值和标准差,该邻域由以像素为中心的 w 乘以 w 大小的矩形窗口定义。k 是一个可配置的参数,用于衡量标准差的影响。R 是灰度图像的最大标准差。

参数:
image(M, N[, …]) ndarray

灰度输入图像。

window_sizeint,或 int 的可迭代对象,可选

窗口大小,指定为单个奇数整数 (3, 5, 7, …),或者长度为 image.ndim 的可迭代对象,其中只包含奇数整数 (例如 (1, 5, 5))。

kfloat,可选

正参数 k 的值。

rfloat,可选

R 的值,即标准差的动态范围。如果为 None,则设置为图像 dtype 范围的一半。

返回:
threshold(M, N[, …]) ndarray

阈值掩码。所有强度高于此值的像素都被认为是前景。

注释

该算法最初是为文本识别而设计的。

参考文献

[1]

J. Sauvola 和 M. Pietikainen,“自适应文档图像二值化”,《模式识别》33(2),第 225-236 页,2000 年。DOI:10.1016/S0031-3203(99)00055-2

示例

>>> from skimage import data
>>> image = data.page()
>>> t_sauvola = threshold_sauvola(image, window_size=15, k=0.2)
>>> binary_image = image > t_sauvola

Niblack 和 Sauvola 阈值化

Niblack 和 Sauvola 阈值化

skimage.filters.threshold_triangle(image, nbins=256)[源代码]#

根据三角形算法返回阈值。

参数:
image(M, N[, …]) ndarray

灰度输入图像。

nbinsint,可选

用于计算直方图的 bin 数。此值对于整数数组将被忽略。

返回:
thresholdfloat

上限阈值。所有强度高于此值的像素都被假定为前景。

参考文献

[1]

Zack, G. W., Rogers, W. E. 和 Latt, S. A., 1977 年,《姐妹染色单体交换频率的自动测量》,《组织化学和细胞化学杂志》25 (7),第 741-753 页DOI:10.1177/25.7.70454

[2]

ImageJ AutoThresholder 代码, http://fiji.sc/wiki/index.php/Auto_Threshold

示例

>>> from skimage.data import camera
>>> image = camera()
>>> thresh = threshold_triangle(image)
>>> binary = image > thresh

skimage.filters.threshold_yen(image=None, nbins=256, *, hist=None)[源代码]#

根据 Yen 方法返回阈值。必须提供图像或 hist。如果给出 hist,则忽略图像的实际直方图。

参数:
image(M, N[, …]) ndarray

灰度输入图像。

nbinsint,可选

用于计算直方图的 bin 数。此值对于整数数组将被忽略。

hist数组或数组的 2 元组,可选

从中确定阈值的直方图,以及可选的对应的 bin 中心强度数组。此函数的另一种用法是仅传递 hist。

返回:
thresholdfloat

上限阈值。所有强度高于此值的像素都被假定为前景。

参考文献

[1]

Yen J.C., Chang F.J. 和 Chang S. (1995) “用于自动多级阈值化的新标准”,《IEEE 图像处理汇刊》,4(3): 370-378。DOI:10.1109/83.366472

[2]

Sezgin M. 和 Sankur B. (2004) “图像阈值技术和定量性能评估调查”,《电子成像杂志》,13(1): 146-165, DOI:10.1117/1.1631315 http://www.busim.ee.boun.edu.tr/~sankur/SankurFolder/Threshold_survey.pdf

[3]

ImageJ AutoThresholder 代码, http://fiji.sc/wiki/index.php/Auto_Threshold

示例

>>> from skimage.data import camera
>>> image = camera()
>>> thresh = threshold_yen(image)
>>> binary = image <= thresh

skimage.filters.try_all_threshold(image, figsize=(8, 5), verbose=True)[源代码]#

返回比较不同阈值处理方法输出的图形。

参数:
image(M, N) ndarray

输入图像。

figsizetuple,可选

图形大小(以英寸为单位)。

verbosebool,可选

为每个方法打印函数名称。

返回:
fig, axtuple

Matplotlib 图形和轴。

注释

使用以下算法

  • isodata

  • li

  • mean

  • minimum

  • otsu

  • triangle

  • yen

示例

>>> from skimage.data import text
>>> fig, ax = try_all_threshold(text(), figsize=(10, 6), verbose=False)

阈值处理

阈值处理

阈值处理

阈值处理

skimage.filters.unsharp_mask(image, radius=1.0, amount=1.0, preserve_range=False, *, channel_axis=None)[源代码]#

反锐化掩模滤波器。

锐化细节被识别为原始图像及其模糊版本之间的差异。然后缩放这些细节,并将其添加回原始图像。

参数:
image(M[, …][, C]) ndarray

输入图像。

radius标量或标量序列,可选

如果给定标量,则其值用于所有维度。如果给定序列,则必须为每个维度提供一个半径,多通道图像的最后一个维度除外。请注意,半径为 0 表示不模糊,不允许使用负值。

amount标量,可选

细节将以此因子放大。该因子可以为 0 或负数。通常,它是一个小的正数,例如 1.0。

保留范围 (preserve_range)布尔值 (bool), 可选

是否保留原始值范围。否则,根据 img_as_float 的约定转换输入图像。另请参阅 https://scikit-image.cn/docs/dev/user_guide/data_types.html

channel_axisint 或 None,可选

如果为 None,则假定图像为灰度(单通道)图像。否则,此参数指示数组的哪个轴对应于通道。

在 0.19 版本中添加:在 0.19 中添加了 channel_axis

返回:
output(M[, …][, C]) float 的 ndarray

应用了锐化掩模的图像。

注释

锐化掩模是一种图像锐化技术。它是一种线性图像操作,并且在数值上是稳定的,不像反卷积那样是一个不适定问题。由于这种稳定性,它通常优于反卷积。

主要思想如下:锐化细节被识别为原始图像及其模糊版本之间的差异。在缩放步骤之后,将这些细节添加回原始图像

增强图像 = 原始图像 + amount * (原始图像 - 模糊图像)

当独立将此滤波器应用于多个颜色图层时,可能会发生颜色溢出。通过仅在合适的颜色空间(如 HSV、HSL、YUV 或 YCbCr)中处理亮度/亮度/强度通道,可以获得更令人愉悦的视觉效果。

大多数数字图像处理入门书籍中都介绍了锐化掩模。此实现基于 [1]

参考文献

[1]

Maria Petrou,Costas Petrou “图像处理:基础知识”,(2010),第二版,第 357 页,ISBN 13: 9781119994398 DOI:10.1002/9781119994398

[2]

维基百科。锐化掩模https://en.wikipedia.org/wiki/Unsharp_masking

示例

>>> array = np.ones(shape=(5,5), dtype=np.uint8)*100
>>> array[2,2] = 120
>>> array
array([[100, 100, 100, 100, 100],
       [100, 100, 100, 100, 100],
       [100, 100, 120, 100, 100],
       [100, 100, 100, 100, 100],
       [100, 100, 100, 100, 100]], dtype=uint8)
>>> np.around(unsharp_mask(array, radius=0.5, amount=2),2)
array([[0.39, 0.39, 0.39, 0.39, 0.39],
       [0.39, 0.39, 0.38, 0.39, 0.39],
       [0.39, 0.38, 0.53, 0.38, 0.39],
       [0.39, 0.39, 0.38, 0.39, 0.39],
       [0.39, 0.39, 0.39, 0.39, 0.39]])
>>> array = np.ones(shape=(5,5), dtype=np.int8)*100
>>> array[2,2] = 127
>>> np.around(unsharp_mask(array, radius=0.5, amount=2),2)
array([[0.79, 0.79, 0.79, 0.79, 0.79],
       [0.79, 0.78, 0.75, 0.78, 0.79],
       [0.79, 0.75, 1.  , 0.75, 0.79],
       [0.79, 0.78, 0.75, 0.78, 0.79],
       [0.79, 0.79, 0.79, 0.79, 0.79]])
>>> np.around(unsharp_mask(array, radius=0.5, amount=2, preserve_range=True), 2)
array([[100.  , 100.  ,  99.99, 100.  , 100.  ],
       [100.  ,  99.39,  95.48,  99.39, 100.  ],
       [ 99.99,  95.48, 147.59,  95.48,  99.99],
       [100.  ,  99.39,  95.48,  99.39, 100.  ],
       [100.  , 100.  ,  99.99, 100.  , 100.  ]])

锐化掩模

锐化掩模

skimage.filters.wiener(data, impulse_response=None, filter_params=None, K=0.25, predefined_filter=None)[源代码]#

最小均方误差 (维纳) 逆滤波器。

参数:
data(M, N) ndarray

输入数据。

K浮点数或 (M, N) ndarray

噪声功率谱与未退化图像功率谱之间的比率。

impulse_response可调用 f(r, c, **filter_params)

滤波器的脉冲响应。 请参阅 LPIFilter2D.__init__。

filter_params字典,可选

脉冲响应函数的其他关键字参数。

其他参数:
predefined_filterLPIFilter2D

如果您需要在不同的图像上多次应用相同的过滤器,请构造 LPIFilter2D 并在此处指定。


skimage.filters.window(window_type, shape, warp_kwargs=None)[源代码]#

返回给定大小和维度的 n 维窗口。

参数:
window_type字符串、浮点数或元组

要创建的窗口类型。此处允许使用 scipy.signal.get_window 支持的任何窗口类型。有关当前列表,请参见下面的注释,或者查阅您机器上 SciPy 版本的文档。

shape整数元组或整数

窗口沿每个轴的形状。如果提供一个整数,则生成一个 1D 窗口。

warp_kwargs字典

传递给 skimage.transform.warp 的关键字参数(例如,warp_kwargs={'order':3} 用于更改插值方法)。

返回:
nd_windowndarray

指定 shape 的窗口。dtypenp.float64

注释

此函数基于 scipy.signal.get_window,因此可以访问该函数可用的所有窗口类型(例如,"hann""boxcar")。请注意,某些窗口类型需要以元组形式提供参数以及窗口名称(例如,("tukey", 0.8))。如果仅提供一个浮点数,则将其解释为 Kaiser 窗口的 beta 参数。

有关更多详细信息,请参见 https://docs.scipy.org.cn/doc/scipy/reference/generated/scipy.signal.windows.get_window.html

请注意,此函数会生成指定 shape 的双精度数组,因此可以生成占用大量可用内存的非常大的数组。

此处创建 nD 窗口的方法是首先计算从预期 nD 窗口中心到数组中每个位置的欧几里得距离。该距离用于通过插值从 scipy.signal.get_window 返回的 1D 窗口中采样。可以使用传递给 skimage.transform.warporder 关键字参数来更改插值方法。

输出窗口中的某些坐标将超出原始信号的范围;这些坐标将用零填充。

窗口类型:- boxcar - triang - blackman - hamming - hann - bartlett - flattop - parzen - bohman - blackmanharris - nuttall - barthann - kaiser (需要 beta) - gaussian (需要标准差) - general_gaussian (需要功率,宽度) - slepian (需要宽度) - dpss (需要归一化半带宽) - chebwin (需要衰减) - exponential (需要衰减尺度) - tukey (需要锥形部分)

参考文献

[1]

二维窗口设计,维基百科,https://en.wikipedia.org/wiki/Two_dimensional_window_design

示例

返回形状为 (512, 512) 的 Hann 窗口

>>> from skimage.filters import window
>>> w = window('hann', (512, 512))

返回 beta 参数为 16 且形状为 (256, 256, 35) 的 Kaiser 窗口

>>> w = window(16, (256, 256, 35))

返回 alpha 参数为 0.8 且形状为 (100, 300) 的 Tukey 窗口

>>> w = window(('tukey', 0.8), (100, 300))

使用极坐标和对数极坐标变换进行配准

使用极坐标和对数极坐标变换进行配准

将窗口函数与图像一起使用

将窗口函数与图像一起使用

通过高斯差分进行带通滤波

通过高斯差分进行带通滤波
class skimage.filters.LPIFilter2D(impulse_response, **filter_params)[源代码]#

基类:object

线性位置不变滤波器 (二维)

__init__(impulse_response, **filter_params)[源代码]#
参数:
impulse_response可调用 f(r, c, **filter_params)

生成脉冲响应的函数。rc 是表示行和列位置的一维向量,换句话说,坐标是 (r[0],c[0])、(r[0],c[1]) 等。**filter_params 会被传递。

换句话说,impulse_response 将像这样被调用

>>> def impulse_response(r, c, **filter_params):
...     pass
>>>
>>> r = [0,0,0,1,1,1,2,2,2]
>>> c = [0,1,2,0,1,2,0,1,2]
>>> filter_params = {'kw1': 1, 'kw2': 2, 'kw3': 3}
>>> impulse_response(r, c, **filter_params)

示例

不进行系数归一化的高斯滤波器

>>> def filt_func(r, c, sigma=1):
...     return np.exp(-(r**2 + c**2)/(2 * sigma**2))
>>> filter = LPIFilter2D(filt_func)