skimage.filters
#
锐化、边缘检测、秩滤波器、阈值处理等。
对 |
|
应用巴特沃斯滤波器来增强高频或低频特征。 |
|
计算 |
|
查找大小在 |
|
使用 Farid 变换查找边缘幅度。 |
|
使用 Farid 变换查找图像的水平边缘。 |
|
使用 Farid 变换查找图像的垂直边缘。 |
|
将给定滤波器应用于数据。 |
|
反向将滤波器应用于给定数据。 |
|
使用 Frangi 血管性滤波器对图像进行滤波。 |
|
返回对 Gabor 滤波器的实部和虚部响应。 |
|
返回复数 2D Gabor 滤波器核。 |
|
多维高斯滤波器。 |
|
使用混合 Hessian 滤波器对图像进行滤波。 |
|
使用拉普拉斯算子查找图像的边缘。 |
|
返回图像的局部中值。 |
|
使用 Meijering 神经元性滤波器对图像进行滤波。 |
|
使用 Prewitt 变换查找边缘幅度。 |
|
使用 Prewitt 变换查找图像的水平边缘。 |
|
使用 Prewitt 变换查找图像的垂直边缘。 |
|
返回形状相同的图像,其中每个像素是 |
|
使用 Roberts' 交叉算子查找边缘幅度。 |
|
使用 Roberts' 交叉算子查找图像的交叉边缘。 |
|
使用 Roberts' 交叉算子查找图像的交叉边缘。 |
|
使用 Sato 管状性滤波器对图像进行滤波。 |
|
使用 Scharr 变换查找边缘幅度。 |
|
使用 Scharr 变换查找图像的水平边缘。 |
|
使用 Scharr 变换查找图像的垂直边缘。 |
|
使用 Sobel 滤波器查找图像中的边缘。 |
|
使用 Sobel 变换查找图像的水平边缘。 |
|
使用 Sobel 变换查找图像的垂直边缘。 |
|
根据 ISODATA 方法返回阈值。 |
|
通过 Li 的迭代最小交叉熵方法计算阈值。 |
|
根据局部像素邻域计算阈值掩码图像。 |
|
根据灰度值的平均值返回阈值。 |
|
根据最小值方法返回阈值。 |
|
生成 |
|
将 Niblack 局部阈值应用于数组。 |
|
根据 Otsu 方法返回阈值。 |
|
将 Sauvola 局部阈值应用于数组。 |
|
根据三角形算法返回阈值。 |
|
根据 Yen 的方法返回阈值。 |
|
返回比较不同阈值处理方法输出的图形。 |
|
反锐化掩模滤波器。 |
|
最小均方误差 (维纳) 逆滤波器。 |
|
返回给定大小和维度的 n 维窗口。 |
|
线性位置不变滤波器 (二维) |
|
- skimage.filters.apply_hysteresis_threshold(image, low, high)[源代码]#
对
image
应用迟滞阈值处理。此算法查找
image
大于high
或image
大于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.pad
的mode='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}\)。参考文献
[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_array
和kernel
的有效互相关。当
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)
将
image
与kernel
互相关的结果。如果使用模式 '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_sigma
和high_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 边缘图。
注释
取水平和垂直导数平方和的平方根,得到一个对方向不敏感的幅度。 与 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
经过滤波的图像(所有刻度上的像素最大值)。
注释
此滤波器的早期版本由 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_x
和sigma_y
将随着频率的增加而减小。如果用户设置了sigma_x
和sigma_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_x
和sigma_y
将随着频率的增加而减小。如果用户设置了sigma_x
和sigma_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 滤波器组
- 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
经过滤波的图像(所有刻度上的像素最大值)。
注释
由 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
经过滤波的图像(所有刻度上的像素最大值)。
参考文献
[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 算子对梯度算子的近似不是完全旋转不变的,因此边缘幅度在边缘方向上略有不同。为了获得更好的旋转不变性,应该使用 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 交叉边缘图。
另请参阅
示例
>>> 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
经过滤波的图像(所有刻度上的像素最大值)。
参考文献
[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 边缘图。
注释
与其他边缘滤波器(如 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 边缘图。
参考文献
[1]D. Kroon, 2009, Short Paper University Twente, 基于核的图像导数的数值优化。
示例
>>> from skimage import data >>> from skimage import filters >>> camera = data.camera() >>> edges = filters.sobel(camera)
将灰度滤波器适配到 RGB 图像边缘算子迟滞阈值处理基于区域边界的区域邻接图 (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
- 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)
- 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 阈值化
- 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 阈值化标记图像区域测量区域属性共定位指标阈值处理测量核膜上的荧光强度排序滤波器
- 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 阈值化
- 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]示例
>>> 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
的窗口。dtype
为np.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.warp
的order
关键字参数来更改插值方法。输出窗口中的某些坐标将超出原始信号的范围;这些坐标将用零填充。
窗口类型:- 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)
生成脉冲响应的函数。
r
和c
是表示行和列位置的一维向量,换句话说,坐标是 (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)
- impulse_response可调用
示例
不进行系数归一化的高斯滤波器
>>> def filt_func(r, c, sigma=1): ... return np.exp(-(r**2 + c**2)/(2 * sigma**2)) >>> filter = LPIFilter2D(filt_func)