skimage.measure
#
使用指定的容差逼近多边形链。 |
|
通过将函数func应用于局部块来对图像进行下采样。 |
|
计算一个指标,该指标指示图像中模糊的强度(0 表示没有模糊,1 表示最大模糊)。 |
|
返回图像的(加权)质心。 |
|
计算二值图像中的欧拉示性数。 |
|
查找给定水平值的二维数组中的等值轮廓。 |
|
测试指定网格上的点是否在多边形内。 |
|
计算输入图像的惯性张量。 |
|
计算图像惯性张量的特征值。 |
|
一个通道的分割二值掩码与第二个通道的分割二值掩码重叠的部分所占的比例。 |
|
标记整数数组的连通区域。 |
|
两个通道之间的 Manders 共定位系数。 |
|
Manders 重叠系数 |
|
Marching Cubes 算法,用于查找 3D 体积数据中的表面。 |
|
计算表面积,给定顶点和三角面。 |
|
计算高达特定阶数的所有原始图像矩。 |
|
计算高达特定阶数的所有中心图像矩。 |
|
计算高达特定阶数的所有原始图像矩。 |
|
计算高达特定阶数的所有中心图像矩。 |
|
计算 Hu 的图像矩集(仅限二维)。 |
|
计算高达特定阶数的所有归一化中心图像矩。 |
|
计算通道中像素强度之间的皮尔逊相关系数。 |
|
计算二值图像中所有对象的总周长。 |
|
计算二值图像中所有对象的总克罗夫顿周长。 |
|
测试点是否位于多边形内。 |
|
返回沿扫描线测量的图像的强度剖面。 |
|
使用 RANSAC(随机抽样一致)算法将模型拟合到数据。 |
|
测量标记图像区域的属性。 |
|
计算图像属性并将其作为与 pandas 兼容的表格返回。 |
|
计算图像的香农熵。 |
|
使用 B 样条曲线细分多边形曲线。 |
|
二维圆的总体最小二乘估计器。 |
|
二维椭圆的总体最小二乘估计器。 |
|
N 维直线的总体最小二乘估计器。 |
- skimage.measure.approximate_polygon(coords, tolerance)[source]#
使用指定的容差逼近多边形链。
它基于 Douglas-Peucker 算法。
请注意,近似多边形始终位于原始多边形的凸包内。
- 参数:
- coords(K, 2) 数组
坐标数组。
- tolerance浮点数
从多边形的原始点到近似多边形链的最大距离。如果容差为 0,则返回原始坐标数组。
- 返回值:
- coords(L, 2) 数组
近似多边形链,其中 L <= K。
参考文献
近似和细分多边形
- skimage.measure.block_reduce(image, block_size=2, func=<function sum>, cval=0, func_kwargs=None)[source]#
通过将函数func应用于局部块来对图像进行下采样。
例如,此函数可用于最大池化和平均池化。
- 参数:
- image(M[, …]) ndarray
N 维输入图像。
- block_size类数组或整数
包含沿每个轴的下采样整数因子的数组。默认块大小为 2。
- func可调用对象
用于计算每个局部块的返回值的函数对象。此函数必须实现一个
axis
参数。主要函数是numpy.sum
、numpy.min
、numpy.max
、numpy.mean
和numpy.median
。另请参见func_kwargs。- cval浮点数
如果图像不能被块大小整除,则为常量填充值。
- func_kwargs字典
传递给func的关键字参数。对于将 dtype 参数传递给
np.mean
特别有用。获取字典输入,例如:func_kwargs={'dtype': np.float16})
。
- 返回值:
- imagendarray
下采样图像,与输入图像具有相同数量的维度。
示例
>>> from skimage.measure import block_reduce >>> image = np.arange(3*3*4).reshape(3, 3, 4) >>> image array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]], [[24, 25, 26, 27], [28, 29, 30, 31], [32, 33, 34, 35]]]) >>> block_reduce(image, block_size=(3, 3, 1), func=np.mean) array([[[16., 17., 18., 19.]]]) >>> image_max1 = block_reduce(image, block_size=(1, 3, 4), func=np.max) >>> image_max1 array([[[11]], [[23]], [[35]]]) >>> image_max2 = block_reduce(image, block_size=(3, 1, 4), func=np.max) >>> image_max2 array([[[27], [31], [35]]])
- skimage.measure.blur_effect(image, h_size=11, channel_axis=None, reduce_func=<function max>)[source]#
计算一个指标,该指标指示图像中模糊的强度(0 表示没有模糊,1 表示最大模糊)。
- 参数:
- imagendarray
RGB 或灰度 nD 图像。在计算模糊度量之前,输入图像将转换为灰度图像。
- h_size整数,可选
重新模糊滤波器的大小。
- channel_axis整数或 None,可选
如果为 None,则假定图像为灰度(单通道)。否则,此参数指示数组的哪个轴对应于颜色通道。
- reduce_func可调用对象,可选
用于计算沿所有轴的模糊度量聚合的函数。如果设置为 None,则返回整个列表,其中第 i 个元素是沿第 i 个轴的模糊度量。
- 返回值:
- blur浮点数(0 到 1)或浮点数列表
模糊度量:默认情况下,沿所有轴的模糊度量的最大值。
注释
h_size必须保持相同的值才能比较图像之间的结果。大多数情况下,默认大小(11)就足够了。这意味着该度量可以清楚地区分最多 11x11 平均滤波器的模糊;如果模糊度更高,则该度量仍然给出良好的结果,但其值趋向于渐近线。
参考文献
[1]Frederique Crete、Thierry Dolmiere、Patricia Ladret 和 Marina Nicolas“模糊效果:使用新的无参考感知模糊度量进行感知和估计”Proc. SPIE 6492,人类视觉和电子成像 XII,64920I (2007) https://hal.archives-ouvertes.fr/hal-00232709 DOI:10.1117/12.702790
估计模糊强度
- skimage.measure.centroid(image, *, spacing=None)[source]#
返回图像的(加权)质心。
- 参数:
- image数组
输入图像。
- spacing: 浮点数元组,形状 (ndim,)
图像沿每个轴的像素间距。
- 返回值:
- center浮点数元组,长度
image.ndim
image
中(非零)像素的质心。
- center浮点数元组,长度
示例
>>> image = np.zeros((20, 20), dtype=np.float64) >>> image[13:17, 13:17] = 0.5 >>> image[10:12, 10:12] = 1 >>> centroid(image) array([13.16666667, 13.16666667])
使用像素图查找对象的测地线中心
- skimage.measure.euler_number(image, connectivity=None)[source]#
计算二值图像中的欧拉示性数。
对于二维对象,欧拉数是对象数减去孔数。对于三维对象,欧拉数计算为对象数加上孔数,减去隧道数或环数。
- 参数:
- image: (M, N[, P]) ndarray
输入图像。如果图像不是二值的,则所有大于零的值都被视为对象。
- connectivity整数,可选
将像素/体素视为邻居时要考虑的最大正交跳数。接受的值范围从 1 到 input.ndim。如果
None
,则使用input.ndim
的完整连接性。4 或 8 邻域定义为二维图像(连接性分别为 1 和 2)。6 或 26 邻域定义为 3D 图像(连接性分别为 1 和 3)。未定义连接性 2。
- 返回值:
- euler_number整数
图像中所有对象的集合的欧拉示性数。
注释
欧拉特征是一个整数,用于描述输入图像中所有对象集合的拓扑结构。如果对象是4连通的,则背景是8连通的,反之亦然。
欧拉特征的计算基于离散空间中的积分几何公式。在实践中,构建邻域配置,并对每个配置应用LUT。使用的系数是Ohser等人的系数。
计算不同连通性的欧拉特征可能很有用。不同连通性结果之间较大的相对差异表明图像分辨率(相对于对象和孔的大小)过低。
参考文献
[1]S. Rivollier. Analyse d’image geometrique et morphometrique par diagrammes de forme et voisinages adaptatifs generaux. PhD thesis, 2010. Ecole Nationale Superieure des Mines de Saint-Etienne. https://tel.archives-ouvertes.fr/tel-00560838
[2]Ohser J., Nagel W., Schladitz K. (2002) The Euler Number of Discretized Sets - On the Choice of Adjacency in Homogeneous Lattices. In: Mecke K., Stoyan D. (eds) Morphology of Condensed Matter. Lecture Notes in Physics, vol 600. Springer, Berlin, Heidelberg.
示例
>>> import numpy as np >>> SAMPLE = np.zeros((100,100,100)); >>> SAMPLE[40:60, 40:60, 40:60]=1 >>> euler_number(SAMPLE) 1... >>> SAMPLE[45:55,45:55,45:55] = 0; >>> euler_number(SAMPLE) 2... >>> SAMPLE = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0], ... [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0], ... [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], ... [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], ... [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0], ... [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], ... [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], ... [1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0], ... [0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1], ... [0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1]]) >>> euler_number(SAMPLE) # doctest: 0 >>> euler_number(SAMPLE, connectivity=1) # doctest: 2
欧拉数
- skimage.measure.find_contours(image, level=None, fully_connected='low', positive_orientation='low', *, mask=None)[source]#
查找给定水平值的二维数组中的等值轮廓。
使用“Marching Squares”(等值线追踪)方法计算输入二维数组在特定级别值下的等值线。数组值进行线性插值,以便为输出轮廓提供更高的精度。
- 参数:
- image(M, N) 双精度型ndarray
用于查找轮廓的输入图像。
- levelfloat,可选
在数组中查找轮廓的值。默认情况下,级别设置为 (max(image) + min(image)) / 2
0.18版本中已更改: 此参数现在是可选的。
- fully_connectedstr,{‘low’, ‘high’}
指示低于给定级别值的数组元素是否被视为完全连通(因此,高于该值的元素将仅面连通),反之亦然。(有关详细信息,请参阅下面的说明。)
- positive_orientationstr,{‘low’, ‘high’}
指示输出轮廓是否会在低值或高值元素的岛屿周围生成正向轮廓。如果为“low”,则轮廓将沿逆时针方向围绕低于等值线的元素。或者,这意味着低值元素始终位于轮廓的左侧。(有关详细信息,请参见下文。)
- mask(M, N) 布尔型或None型ndarray
布尔掩码,在我们要绘制轮廓的地方为True。请注意,NaN值始终从所考虑的区域中排除(在
array
为NaN
的地方,mask
设置为False
)。
- 返回值:
- contours(K, 2) ndarray 列表
每个轮廓都是一个
(row, column)
坐标的ndarray,沿着轮廓。
注释
Marching Squares算法是Marching Cubes算法[1]的特例。此处提供了一个简单的解释
https://users.polytech.unice.fr/~lingrand/MarchingCubes/algo.html
Marching Squares算法中存在一个模棱两可的情况:当给定的
2 x 2
元素正方形有两个高值元素和两个低值元素时,每对元素都位于对角线上。(其中高值和低值是相对于所寻求的轮廓值而言的。)在这种情况下,高值元素可以通过分离低值元素的细长地峡“连接在一起”,反之亦然。当元素通过对角线连接在一起时,它们被认为是“完全连接”(也称为“面+顶点连接”或“8连通”)。只有高值或低值元素可以完全连接,另一组将被视为“面连接”或“4连通”。默认情况下,低值元素被视为完全连接;这可以通过“fully_connected”参数更改。输出轮廓不保证是闭合的:与数组边缘或被屏蔽区域(在mask为False或array为NaN的地方)相交的轮廓将保持打开状态。所有其他轮廓都将闭合。(可以通过检查起点是否与终点相同来测试轮廓的闭合性。)
轮廓是有方向的。默认情况下,低于轮廓值的数组值位于轮廓左侧,高于轮廓值的数组值位于轮廓右侧。这意味着轮廓将围绕低值像素的岛屿逆时针旋转(即“正向”)。此行为可以通过“positive_orientation”参数更改。
输出列表中轮廓的顺序由轮廓中最小的
x,y
(按字典序)坐标的位置确定。这是遍历输入数组的方式的副作用,但可以依赖它。警告
假设数组坐标/值指的是数组元素的中心。举一个简单的输入示例:
[0, 1]
。此数组中0.5的插值位置位于0元素(在x=0
处)和1元素(在x=1
处)之间,因此将落在x=0.5
处。这意味着要找到合理的轮廓,最好在预期的“亮”值和“暗”值之间找到轮廓。特别是,给定一个二值化数组,不要选择在数组的低值或高值处查找轮廓。这通常会产生退化的轮廓,尤其是在宽度为单个数组元素的结构周围。相反,如上所述,选择一个中间值。
参考文献
[1]Lorensen,William和Harvey E. Cline。Marching Cubes:一种高分辨率3D表面构造算法。计算机图形学(SIGGRAPH 87会议记录)21(4) 1987年7月,第163-170页)。DOI:10.1145/37401.37422
示例
>>> a = np.zeros((3, 3)) >>> a[0, 0] = 1 >>> a array([[1., 0., 0.], [0., 0., 0.], [0., 0., 0.]]) >>> find_contours(a, 0.5) [array([[0. , 0.5], [0.5, 0. ]])]
- skimage.measure.grid_points_in_poly(shape, verts, binarize=True)[source]#
测试指定网格上的点是否在多边形内。
对于网格上的每个
(r, c)
坐标,例如(0, 0)
,(0, 1)
等,测试该点是否位于多边形内部。您可以使用binarize标志控制输出类型。有关更多详细信息,请参阅其文档。
- 参数:
- shape元组 (M, N)
网格的形状。
- verts(V, 2) 数组
指定多边形的V个顶点,按顺时针或逆时针方向排序。第一个点可以(但不一定需要)重复。
- binarize: bool
如果True,则函数的输出为布尔掩码。否则,它是一个标记数组。标签为:O - 外部,1 - 内部,2 - 顶点,3 - 边缘。
- 返回值:
- mask(M, N) ndarray
如果binarize为True,则输出为布尔掩码。True表示相应的像素落在多边形内部。如果binarize为False,则输出为标记数组,像素具有0到3之间的标签。值的含义为:O - 外部,1 - 内部,2 - 顶点,3 - 边缘。
另请参阅
- skimage.measure.inertia_tensor(image, mu=None, *, spacing=None)[source]#
计算输入图像的惯性张量。
- 参数:
- image数组
输入图像。
- mu数组,可选
image
的预先计算的中心矩。惯性张量计算需要图像的中心矩。如果某个应用程序同时需要中心矩和惯性张量(例如,skimage.measure.regionprops
),则预先计算它们并将其传递给惯性张量调用会更有效。- spacing: 浮点数元组,形状 (ndim,)
图像沿每个轴的像素间距。
- 返回值:
- T数组,形状
(image.ndim, image.ndim)
输入图像的惯性张量。\(T_{i, j}\)包含图像强度沿轴\(i\)和\(j\)的协方差。
- T数组,形状
参考文献
[2]Bernd Jähne. Spatio-Temporal Image Processing: Theory and Scientific Applications. (第8章:张量方法) Springer,1993年。
- skimage.measure.inertia_tensor_eigvals(image, mu=None, T=None, *, spacing=None)[source]#
计算图像惯性张量的特征值。
惯性张量测量图像强度沿图像轴的协方差。(参见
inertia_tensor
。)因此,张量特征值的相对大小是图像中(亮)对象的伸长率的度量。- 参数:
- image数组
输入图像。
- mu数组,可选
image
的预先计算的中心矩。- T数组,形状
(image.ndim, image.ndim)
预先计算的惯性张量。如果给出
T
,则忽略mu
和image
。- spacing: 浮点数元组,形状 (ndim,)
图像沿每个轴的像素间距。
- 返回值:
- eigvalsfloat 类型列表,长度为
image.ndim
image
的惯性张量的特征值,按降序排列。
- eigvalsfloat 类型列表,长度为
注释
计算特征值需要输入图像的惯性张量。如果提供中心矩 (
mu
),则速度会快得多;或者,也可以直接提供惯性张量 (T
)。
- skimage.measure.intersection_coeff(image0_mask, image1_mask, mask=None)[source]#
一个通道的分割二值掩码与第二个通道的分割二值掩码重叠的部分所占的比例。
- 参数:
- image0_mask(M, N) 形状的布尔型数组
通道 A 的图像掩码。
- image1_mask(M, N) 形状的布尔型数组
通道 B 的图像掩码。必须与image0_mask具有相同的维度。
- mask(M, N) 形状的布尔型数组,可选
仅包含计算中感兴趣区域掩码内的image0_mask和image1_mask像素。必须与image0_mask具有相同的维度。
- 返回值:
- 交集系数,浮点数
image0_mask与image1_mask重叠的部分所占的比例。
共定位指标
- skimage.measure.label(label_image, background=None, return_num=False, connectivity=None)[source]#
标记整数数组的连通区域。
当两个像素是相邻像素且具有相同的值时,它们就被认为是连接的。在二维情况下,它们可以是 1 连接或 2 连接的相邻像素。该值指的是将像素/体素视为相邻像素时要考虑的最大正交跳跃次数。
1-connectivity 2-connectivity diagonal connection close-up [ ] [ ] [ ] [ ] [ ] | \ | / | <- hop 2 [ ]--[x]--[ ] [ ]--[x]--[ ] [x]--[ ] | / | \ hop 1 [ ] [ ] [ ] [ ]
- 参数:
- label_image整数型数组
要标记的图像。
- background整数,可选
将所有具有此值像素视为背景像素,并将其标记为 0。默认情况下,值为 0 的像素被视为背景像素。
- return_num布尔型,可选
是否返回分配的标签数量。
- connectivity整数,可选
将像素/体素视为相邻像素时要考虑的最大正交跳跃次数。接受的值范围为 1 到 input.ndim。如果为
None
,则使用input.ndim
的完整连接。
- 返回值:
- labels整数型数组
标记后的数组,其中所有连接区域都被分配了相同的整数值。
- num整数,可选
标签数量,等于最大标签索引,仅当 return_num 为True时才返回。
参考文献
[1]Christophe Fiorio 和 Jens Gustedt,“图像处理的两种线性时间并查集策略”,理论计算机科学 154 (1996),第 165-181 页。
[2]Kensheng Wu、Ekow Otoo 和 Arie Shoshani,“优化连通分量标记算法”,论文 LBNL-56864,2005 年,劳伦斯伯克利国家实验室(加利福尼亚大学),http://repositories.cdlib.org/lbnl/LBNL-56864
示例
>>> import numpy as np >>> x = np.eye(3).astype(int) >>> print(x) [[1 0 0] [0 1 0] [0 0 1]] >>> print(label(x, connectivity=1)) [[1 0 0] [0 2 0] [0 0 3]] >>> print(label(x, connectivity=2)) [[1 0 0] [0 1 0] [0 0 1]] >>> print(label(x, background=-1)) [[1 2 2] [2 1 2] [2 2 1]] >>> x = np.array([[1, 0, 0], ... [1, 1, 5], ... [0, 0, 0]]) >>> print(label(x)) [[1 0 0] [1 1 2] [0 0 0]]
移除对象扩展分割标签,避免重叠标记图像区域查找两个分割的交集极值使用 pandas 探索和可视化区域属性测量区域属性评估分割指标欧拉数分割人体细胞(有丝分裂)跟踪金属合金的凝固过程
- skimage.measure.manders_coloc_coeff(image0, image1_mask, mask=None)[source]#
两个通道之间的 Manders 共定位系数。
- 参数:
- image0(M, N) 形状的数组
通道 A 的图像。所有像素值都应为非负数。
- image1_mask(M, N) 形状的布尔型数组
通道 B 中具有分割感兴趣区域的二值掩码。必须与image0具有相同的维度。
- mask(M, N) 形状的布尔型数组,可选
仅包含计算中感兴趣区域掩码内的image0像素值。必须与image0具有相同的维度。
- 返回值:
- mcc浮点数
Manders 共定位系数。
注释
Manders 共定位系数 (MCC) 是特定通道(通道 A)的总强度中位于第二个通道(通道 B)的分割区域内的部分所占的比例 [1]。其取值范围为 0(无共定位)到 1(完全共定位)。它也被称为 M1 和 M2。
MCC 通常用于测量特定蛋白质在亚细胞区室中的共定位。通常,通过设置一个阈值来生成通道 B 的分割掩码,像素值必须高于该阈值才能包含在 MCC 计算中。在此实现中,通道 B 掩码作为参数image1_mask提供,允许用户事先决定确切的分割方法。
实现的方程为
\[r = \frac{\sum A_{i,coloc}}{\sum A_i}\]- 其中
\(A_i\) 是image0中第 \(i^{th}\) 个像素的值 \(A_{i,coloc} = A_i\) 如果 \(Bmask_i > 0\) \(Bmask_i\) 是mask中第 \(i^{th}\) 个像素的值
MCC 对噪声敏感,第一个通道中的弥散信号会使其值膨胀。在计算 MCC 之前,应处理图像以去除散焦和背景光 [2]。
参考文献
[1]Manders,EMM,Verbeek,FJ 和 Aten,JA(1993),双色共聚焦图像中对象共定位的测量。显微镜杂志,169:375-382。https://doi.org/10.1111/j.1365-2818.1993.tb03313.x https://imagej.net/media/manders.pdf
[2]Dunn,KW,Kamocka,MM 和 McDonald,JH(2011)。生物显微镜共定位评估的实用指南。美国生理学杂志。细胞生理学,300(4),C723-C742。https://doi.org/10.1152/ajpcell.00462.2010
共定位指标
- skimage.measure.manders_overlap_coeff(image0, image1, mask=None)[source]#
Manders 重叠系数
- 参数:
- image0(M, N) 形状的数组
通道 A 的图像。所有像素值都应为非负数。
- image1(M, N) 形状的数组
通道 B 的图像。所有像素值都应为非负数。必须与image0具有相同的维度
- mask(M, N) 形状的布尔型数组,可选
仅包含计算中感兴趣区域掩码内的image0和image1像素值。必须与image0具有相同的维度。
- 返回值:
- moc: 浮点数
两个图像之间像素强度的 Manders 重叠系数。
注释
Manders 重叠系数 (MOC) 由以下公式给出 [1]
\[r = \frac{\sum A_i B_i}{\sqrt{\sum A_i^2 \sum B_i^2}}\]- 其中
\(A_i\) 是image0中第 \(i^{th}\) 个像素的值 \(B_i\) 是image1中第 \(i^{th}\) 个像素的值
其取值范围为 0(无共定位)到 1(所有像素完全共定位)。
MOC 没有考虑像素强度,仅考虑两个通道都具有正值的像素比例[R2208c1a5d6e1-2]_ [3]。其有效性受到质疑,因为它会随着共现和相关性差异而变化,因此特定的 MOC 值可能表示范围广泛的共定位模式 [4] [5]。
参考文献
[1]Manders,EMM,Verbeek,FJ 和 Aten,JA(1993),双色共聚焦图像中对象共定位的测量。显微镜杂志,169:375-382。https://doi.org/10.1111/j.1365-2818.1993.tb03313.x https://imagej.net/media/manders.pdf
[2]Dunn,KW,Kamocka,MM 和 McDonald,JH(2011)。生物显微镜共定位评估的实用指南。美国生理学杂志。细胞生理学,300(4),C723-C742。https://doi.org/10.1152/ajpcell.00462.2010
[3]Bolte,S. 和 Cordelières,FP(2006),光学显微镜亚细胞共定位分析指南。显微镜杂志,224:213-232。https://doi.org/10.1111/j.1365-2818.2006.01
[4]Adler J、Parmryd I.(2010),通过相关性量化共定位:Pearson 相关系数优于 Manders 重叠系数。细胞计量学 A。8 月;77(8):733-42。https://doi.org/10.1002/cyto.a.20896
[5]Adler,J、Parmryd,I. 量化共定位:丢弃 Manders 重叠系数的理由。细胞计量学。2021;99:910-920。https://doi.org/10.1002/cyto.a.24336
- skimage.measure.marching_cubes(volume, level=None, *, spacing=(1.0, 1.0, 1.0), gradient_direction='descent', step_size=1, allow_degenerate=True, method='lewiner', mask=None)[source]#
Marching Cubes 算法,用于查找 3D 体积数据中的表面。
与 Lorensen 等人提出的方法 [2] 相比,Lewiner 等人的算法速度更快,可以解决歧义,并保证拓扑结果的正确性。因此,该算法通常是更好的选择。
- 参数:
- volume(M, N, P) ndarray
用于查找等值面的输入数据体积。如果必要,将在内部转换为 float32。
- levelfloat,可选
在 volume 中搜索等值面的轮廓值。如果未给出或为 None,则使用 vol 的最小值和最大值的平均值。
- spacing长度为 3 的浮点数元组,可选
与 numpy 数组索引维度 (M, N, P) 对应的空间维度的体素间距,如 volume 中所示。
- gradient_direction字符串,可选
控制网格是从具有梯度下降的等值面生成的,目标是感兴趣的对象(默认值),或者相反,考虑到左手规则。这两个选项是:* descent:对象大于外部 * ascent:外部大于对象
- step_size整数,可选
体素中的步长。默认为 1。更大的步长会产生更快但更粗糙的结果。不过,结果始终在拓扑上是正确的。
- allow_degenerate布尔值,可选
是否允许在最终结果中出现退化(即零面积)三角形。默认为 True。如果为 False,则会移除退化三角形,但会使算法变慢。
- method: {‘lewiner’, ‘lorensen’},可选
将使用 Lewiner 等人或 Lorensen 等人的方法。
- mask(M, N, P) 数组,可选
布尔数组。仅在 True 元素上计算游走立方体算法。当界面位于体积 M、N、P 的某个区域内时,这将节省计算时间——例如,立方体的上半部分——并且还允许计算有限表面——即在立方体边界处不结束的开放表面。
- 返回值:
- verts(V, 3) 数组
V 个唯一网格顶点的空间坐标。坐标顺序与输入 volume (M, N, P) 匹配。如果将
allow_degenerate
设置为 True,则网格中存在退化三角形会导致此数组具有重复的顶点。- faces(F, 3) 数组
通过引用
verts
中的顶点索引来定义三角面。此算法专门输出三角形,因此每个面都正好有三个索引。- normals(V, 3) 数组
每个顶点处的法线方向,根据数据计算得出。
- values(V,) 数组
提供每个顶点附近局部区域中数据最大值的度量。可视化工具可以使用它将颜色图应用于网格。
注释
该算法 [1] 是 Chernyaev 的 Marching Cubes 33 算法的改进版本。它是一种高效的算法,它依赖于大量查找表来处理许多不同的情况,使算法相对简单。此实现是用 Cython 编写的,移植自 Lewiner 的 C++ 实现。
要量化此算法生成的等值面的面积,请将 verts 和 faces 传递给
skimage.measure.mesh_surface_area
。关于算法输出的可视化,要对名为 myvolume 的体积进行轮廓化,大约在 0.0 水平,使用
mayavi
包>>> >> from mayavi import mlab >> verts, faces, _, _ = marching_cubes(myvolume, 0.0) >> mlab.triangular_mesh([vert[0] for vert in verts], [vert[1] for vert in verts], [vert[2] for vert in verts], faces) >> mlab.show()
类似地,使用
visvis
包>>> >> import visvis as vv >> verts, faces, normals, values = marching_cubes(myvolume, 0.0) >> vv.mesh(np.fliplr(verts), faces, normals, values) >> vv.use().Run()
要减少网格中三角形的数量以提高性能,请参阅此 示例,该示例使用
mayavi
包。参考文献
[1]Thomas Lewiner、Helio Lopes、Antonio Wilson Vieira 和 Geovan Tavares。具有拓扑保证的游走立方体情况的高效实现。图形工具杂志 8(2) 第 1-15 页(2003 年 12 月)。DOI:10.1080/10867651.2003.10487582
[2]Lorensen,William和Harvey E. Cline。Marching Cubes:一种高分辨率3D表面构造算法。计算机图形学(SIGGRAPH 87会议记录)21(4) 1987年7月,第163-170页)。DOI:10.1145/37401.37422
游走立方体
- skimage.measure.mesh_surface_area(verts, faces)[source]#
计算表面积,给定顶点和三角面。
- 参数:
- verts(V, 3) 浮点数数组
包含 V 个唯一网格顶点坐标的数组。
- faces(F, 3) 整数数组
长度为 3 的整数列表,引用 verts 中提供的顶点坐标。
- 返回值:
- area浮点数
网格的表面积。单位现在为 [坐标单位] ** 2。
注释
此函数期望的参数是
skimage.measure.marching_cubes
的前两个输出。对于单位正确的输出,请确保将正确的 spacing 传递给skimage.measure.marching_cubes
。仅当提供的
faces
全部为三角形时,此算法才能正常工作。
- skimage.measure.moments(image, order=3, *, spacing=None)[source]#
计算高达特定阶数的所有原始图像矩。
- 可以根据原始图像矩计算以下属性
面积为:
M[0, 0]
。质心为:{
M[1, 0] / M[0, 0]
,M[0, 1] / M[0, 0]
}。
请注意,原始矩既不是平移不变的,也不是尺度不变的或旋转不变的。
- 参数:
- image(N[, …]) 双精度或 uint8 数组
作为图像的光栅化形状。
- order整数,可选
矩的最大阶数。默认为 3。
- spacing: 浮点数元组,形状 (ndim,)
图像沿每个轴的像素间距。
- 返回值:
- m(
order + 1
,order + 1
) 数组 原始图像矩。
- m(
参考文献
[1]Wilhelm Burger,Mark Burge。数字图像处理原理:核心算法。施普林格出版社,伦敦,2009 年。
[2]B. Jähne。数字图像处理。施普林格出版社,柏林-海德堡,第 6 版,2005 年。
[3]T. H. Reiss。使用不变图像特征识别平面对象,来自计算机科学讲义,第 676 页。施普林格出版社,柏林,1993 年。
示例
>>> image = np.zeros((20, 20), dtype=np.float64) >>> image[13:17, 13:17] = 1 >>> M = moments(image) >>> centroid = (M[1, 0] / M[0, 0], M[0, 1] / M[0, 0]) >>> centroid (14.5, 14.5)
- skimage.measure.moments_central(image, center=None, order=3, *, spacing=None, **kwargs)[source]#
计算高达特定阶数的所有中心图像矩。
中心坐标 (cr, cc) 可以根据原始矩计算如下:{
M[1, 0] / M[0, 0]
,M[0, 1] / M[0, 0]
}。请注意,中心矩是平移不变的,但不是尺度不变的或旋转不变的。
- 参数:
- image(N[, …]) 双精度或 uint8 数组
作为图像的光栅化形状。
- center浮点数元组,可选
图像质心的坐标。如果未提供,则将计算此坐标。
- order整数,可选
计算的矩的最大阶数。
- spacing: 浮点数元组,形状 (ndim,)
图像沿每个轴的像素间距。
- 返回值:
- mu(
order + 1
,order + 1
) 数组 中心图像矩。
- mu(
参考文献
[1]Wilhelm Burger,Mark Burge。数字图像处理原理:核心算法。施普林格出版社,伦敦,2009 年。
[2]B. Jähne。数字图像处理。施普林格出版社,柏林-海德堡,第 6 版,2005 年。
[3]T. H. Reiss。使用不变图像特征识别平面对象,来自计算机科学讲义,第 676 页。施普林格出版社,柏林,1993 年。
示例
>>> image = np.zeros((20, 20), dtype=np.float64) >>> image[13:17, 13:17] = 1 >>> M = moments(image) >>> centroid = (M[1, 0] / M[0, 0], M[0, 1] / M[0, 0]) >>> moments_central(image, centroid) array([[16., 0., 20., 0.], [ 0., 0., 0., 0.], [20., 0., 25., 0.], [ 0., 0., 0., 0.]])
- skimage.measure.moments_coords(coords, order=3)[source]#
计算高达特定阶数的所有原始图像矩。
- 可以根据原始图像矩计算以下属性
面积为:
M[0, 0]
。质心为:{
M[1, 0] / M[0, 0]
,M[0, 1] / M[0, 0]
}。
注意,原始矩不具有平移、缩放或旋转不变性。
- 参数:
- coords(N, D) 双精度或 uint8 数组
描述笛卡尔空间中 D 维图像的 N 个点的数组。
- order整数,可选
矩的最大阶数。默认为 3。
- 返回值:
- M(
order + 1
,order + 1
, …) 数组 原始图像矩。(D 维)
- M(
参考文献
[1]Johannes Kilian. 简单图像矩分析。达勒姆大学,0.2 版,达勒姆,2001 年。
示例
>>> coords = np.array([[row, col] ... for row in range(13, 17) ... for col in range(14, 18)], dtype=np.float64) >>> M = moments_coords(coords) >>> centroid = (M[1, 0] / M[0, 0], M[0, 1] / M[0, 0]) >>> centroid (14.5, 15.5)
- skimage.measure.moments_coords_central(coords, center=None, order=3)[source]#
计算高达特定阶数的所有中心图像矩。
- 可以根据原始图像矩计算以下属性
面积为:
M[0, 0]
。质心为:{
M[1, 0] / M[0, 0]
,M[0, 1] / M[0, 0]
}。
请注意,原始矩既不是平移不变的,也不是尺度不变的或旋转不变的。
- 参数:
- coords(N, D) 双精度或 uint8 数组
描述笛卡尔空间中 D 维图像的 N 个点的数组。也接受由
np.nonzero
返回的坐标元组作为输入。- center浮点数元组,可选
图像质心的坐标。如果未提供,则将计算此坐标。
- order整数,可选
矩的最大阶数。默认为 3。
- 返回值:
- Mc(
order + 1
,order + 1
, …) 数组 中心图像矩。(D 维)
- Mc(
参考文献
[1]Johannes Kilian. 简单图像矩分析。达勒姆大学,0.2 版,达勒姆,2001 年。
示例
>>> coords = np.array([[row, col] ... for row in range(13, 17) ... for col in range(14, 18)]) >>> moments_coords_central(coords) array([[16., 0., 20., 0.], [ 0., 0., 0., 0.], [20., 0., 25., 0.], [ 0., 0., 0., 0.]])
如上所示,对于对称物体,当以物体的质心(或质量中心)(默认值)为中心时,奇数阶矩(第 1 列和第 3 列,第 1 行和第 3 行)为零。如果我们通过添加一个新点来打破对称性,则这将不再成立。
>>> coords2 = np.concatenate((coords, [[17, 17]]), axis=0) >>> np.round(moments_coords_central(coords2), ... decimals=2) array([[17. , 0. , 22.12, -2.49], [ 0. , 3.53, 1.73, 7.4 ], [25.88, 6.02, 36.63, 8.83], [ 4.15, 19.17, 14.8 , 39.6 ]])
当中心为 (0, 0) 时,图像矩和中心图像矩是等价的(根据定义)。
>>> np.allclose(moments_coords(coords), ... moments_coords_central(coords, (0, 0))) True
- skimage.measure.moments_hu(nu)[source]#
计算 Hu 的图像矩集(仅限 2D)。
注意,这组矩被证明具有平移、缩放和旋转不变性。
- 参数:
- nu(M, M) 数组
归一化中心图像矩,其中 M 必须大于或等于 4。
- 返回值:
- nu(7,) 数组
Hu 的图像矩集。
参考文献
[1]M. K. Hu,“基于矩不变性的视觉模式识别”,IRE Trans. 信息理论,第 IT-8 卷,第 179-187 页,1962 年
[2]Wilhelm Burger,Mark Burge。数字图像处理原理:核心算法。施普林格出版社,伦敦,2009 年。
[3]B. Jähne。数字图像处理。施普林格出版社,柏林-海德堡,第 6 版,2005 年。
[4]T. H. Reiss。使用不变图像特征识别平面对象,来自计算机科学讲义,第 676 页。施普林格出版社,柏林,1993 年。
示例
>>> image = np.zeros((20, 20), dtype=np.float64) >>> image[13:17, 13:17] = 0.5 >>> image[10:12, 10:12] = 1 >>> mu = moments_central(image) >>> nu = moments_normalized(mu) >>> moments_hu(nu) array([0.74537037, 0.35116598, 0.10404918, 0.04064421, 0.00264312, 0.02408546, 0. ])
- skimage.measure.moments_normalized(mu, order=3, spacing=None)[source]#
计算高达特定阶数的所有归一化中心图像矩。
注意,归一化中心矩具有平移和缩放不变性,但没有旋转不变性。
- 参数:
- mu(M[, …], M) 数组
中心图像矩,其中 M 必须大于或等于
order
。- order整数,可选
矩的最大阶数。默认为 3。
- spacing: 浮点数元组,形状 (ndim,)
图像沿每个轴的像素间距。
- 返回值:
- nu(
order + 1``[, ...], ``order + 1
) 数组 归一化中心图像矩。
- nu(
参考文献
[1]Wilhelm Burger,Mark Burge。数字图像处理原理:核心算法。施普林格出版社,伦敦,2009 年。
[2]B. Jähne。数字图像处理。施普林格出版社,柏林-海德堡,第 6 版,2005 年。
[3]T. H. Reiss。使用不变图像特征识别平面对象,来自计算机科学讲义,第 676 页。施普林格出版社,柏林,1993 年。
示例
>>> image = np.zeros((20, 20), dtype=np.float64) >>> image[13:17, 13:17] = 1 >>> m = moments(image) >>> centroid = (m[0, 1] / m[0, 0], m[1, 0] / m[0, 0]) >>> mu = moments_central(image, centroid) >>> moments_normalized(mu) array([[ nan, nan, 0.078125 , 0. ], [ nan, 0. , 0. , 0. ], [0.078125 , 0. , 0.00610352, 0. ], [0. , 0. , 0. , 0. ]])
- skimage.measure.pearson_corr_coeff(image0, image1, mask=None)[source]#
计算通道中像素强度之间的皮尔逊相关系数。
- 参数:
- image0(M, N) 形状的数组
通道 A 的图像。
- image1(M, N) 形状的数组
要与通道 B 相关的通道 2 的图像。必须与 image0 的尺寸相同。
- mask(M, N) 形状的布尔型数组,可选
仅在该感兴趣区域掩码内的 image0 和 image1 像素包含在计算中。必须与 image0 的尺寸相同。
- 返回值:
- pcc浮点数
两幅图像之间像素强度的皮尔逊相关系数,如果提供掩码,则在掩码内。
- p 值浮点数
双尾 p 值。
注释
皮尔逊相关系数 (PCC) 测量两幅图像像素强度之间的线性相关性。其值范围从 -1(表示完美的线性反相关)到 +1(表示完美的线性相关)。p 值的计算假设每个输入图像中像素的强度服从正态分布。
使用 Scipy 实现的皮尔逊相关系数。有关更多信息和注意事项,请参阅 [1]。
\[r = \frac{\sum (A_i - m_A_i) (B_i - m_B_i)} {\sqrt{\sum (A_i - m_A_i)^2 \sum (B_i - m_B_i)^2}}\]- 其中
\(A_i\) 是 image0 中第 \(i^{th}\) 个像素的值 \(B_i\) 是 image1 中第 \(i^{th}\) 个像素的值,\(m_A_i\) 是 image0 中像素值的平均值 \(m_B_i\) 是 image1 中像素值的平均值
较低的 PCC 值并不一定意味着两个通道强度之间没有相关性,而仅仅意味着没有线性相关性。您可能希望在二维散点图中绘制两个通道的每个像素强度,并在视觉上识别出非线性相关性时使用斯皮尔曼等级相关性 [2]。还要考虑您是否对相关性或共现性感兴趣,在这种情况下,使用涉及分割掩码的方法(例如 MCC 或交集系数)可能更合适 [3] [4]。
提供图像中仅相关部分(例如,细胞或特定的细胞隔室)的掩码并去除噪声非常重要,因为 PCC 对这些度量敏感 [3] [4]。
参考文献
[3] (1,2)Dunn,KW,Kamocka,MM 和 McDonald,JH(2011)。生物显微镜共定位评估的实用指南。美国生理学杂志。细胞生理学,300(4),C723-C742。https://doi.org/10.1152/ajpcell.00462.2010
[4] (1,2)Bolte,S. 和 Cordelières,F.P.(2006),光学显微镜下亚细胞共定位分析指南。显微镜杂志,224:213-232。https://doi.org/10.1111/j.1365-2818.2006.01706.x
共定位指标
- skimage.measure.perimeter(image, neighborhood=4)[source]#
计算二值图像中所有对象的总周长。
- 参数:
- image(M, N) ndarray
二值输入图像。
- neighborhood4 或 8,可选
用于边界像素确定的邻域连接性。它用于计算轮廓。较高的邻域会扩大计算周长的边界。
- 返回值:
- perimeter浮点数
二值图像中所有物体的总周长。
参考文献
[1]K. Benkrid,D. Crookes。周长估计器的设计和 FPGA 实现。贝尔法斯特女王大学。http://www.cs.qub.ac.uk/~d.crookes/webpubs/papers/perimeter.doc
示例
>>> from skimage import data, util >>> from skimage.measure import label >>> # coins image (binary) >>> img_coins = data.coins() > 110 >>> # total perimeter of all objects in the image >>> perimeter(img_coins, neighborhood=4) 7796.867... >>> perimeter(img_coins, neighborhood=8) 8806.268...
使用不同的估计器测量周长。
- skimage.measure.perimeter_crofton(image, directions=4)[source]#
计算二值图像中所有对象的总克罗夫顿周长。
- 参数:
- image(M, N) ndarray
输入图像。如果图像不是二值的,则所有大于零的值都被视为对象。
- directions2 或 4,可选
用于逼近克罗夫顿周长的方向数。默认情况下,使用 4:它应该比 2 更准确。两种情况下的计算时间相同。
- 返回值:
- perimeter浮点数
二值图像中所有物体的总周长。
注释
此度量基于克罗夫顿公式 [1],它是积分几何中的一个度量。它是通过沿所有方向的二重积分来定义一般曲线长度评估的。在离散空间中,2 或 4 个方向提供了相当好的近似值,对于更复杂的形状,4 比 2 更准确。
与
perimeter()
类似,此函数返回连续空间中周长的近似值。参考文献
[2]S. Rivollier. Analyse d’image geometrique et morphometrique par diagrammes de forme et voisinages adaptatifs generaux. PhD thesis, 2010. Ecole Nationale Superieure des Mines de Saint-Etienne. https://tel.archives-ouvertes.fr/tel-00560838
示例
>>> from skimage import data, util >>> from skimage.measure import label >>> # coins image (binary) >>> img_coins = data.coins() > 110 >>> # total perimeter of all objects in the image >>> perimeter_crofton(img_coins, directions=2) 8144.578... >>> perimeter_crofton(img_coins, directions=4) 7837.077...
使用不同的估计器测量周长。
- skimage.measure.points_in_poly(points, verts)[source]#
测试点是否位于多边形内。
- 参数:
- points(K, 2) 数组
输入点,
(x, y)
。- verts(L, 2) 数组
多边形的顶点,按顺时针或逆时针排序。第一个点可以(但不一定)重复。
- 返回值:
- mask(K,) 布尔型数组
如果对应的点在多边形内,则为 True。
另请参阅
- skimage.measure.profile_line(image, src, dst, linewidth=1, order=None, mode='reflect', cval=0.0, *, reduce_func=<function mean>)[source]#
返回沿扫描线测量的图像的强度剖面。
- 参数:
- imagendarray,形状 (M, N[, C])
图像,可以是灰度图像(二维数组)或多通道图像(三维数组,其中最后一个轴包含通道信息)。
- src类数组,形状 (2,)
扫描线的起始点的坐标。
- dst类数组,形状 (2,)
扫描线的终点的坐标。与标准的 NumPy 索引不同,目标点包含在轮廓中。
- linewidthint,可选
扫描宽度,垂直于线条。
- order{0, 1, 2, 3, 4, 5} 中的 int,可选
样条插值阶数,默认为 0(如果 image.dtype 为 bool)或 1(否则)。阶数必须在 0-5 之间。有关详细信息,请参见
skimage.transform.warp
。- mode{'constant', 'nearest', 'reflect', 'mirror', 'wrap'},可选
如何计算图像外部的任何值。
- cvalfloat,可选
如果 mode 为 'constant',则在图像外部使用什么常数值。
- reduce_func可调用对象,可选
当 linewidth > 1 时,用于计算垂直于 profile_line 方向的像素值聚合的函数。如果设置为 None,则返回未简化的数组。
- 返回值:
- return_value数组
沿扫描线的强度轮廓。轮廓的长度是计算出的扫描线长度的上限。
示例
>>> x = np.array([[1, 1, 1, 2, 2, 2]]) >>> img = np.vstack([np.zeros_like(x), x, x, x, np.zeros_like(x)]) >>> img array([[0, 0, 0, 0, 0, 0], [1, 1, 1, 2, 2, 2], [1, 1, 1, 2, 2, 2], [1, 1, 1, 2, 2, 2], [0, 0, 0, 0, 0, 0]]) >>> profile_line(img, (2, 1), (2, 4)) array([1., 1., 2., 2.]) >>> profile_line(img, (1, 0), (1, 6), cval=4) array([1., 1., 1., 2., 2., 2., 2.])
与标准 NumPy 索引不同,目标点包含在轮廓中。例如
>>> profile_line(img, (1, 0), (1, 6)) # The final point is out of bounds array([1., 1., 1., 2., 2., 2., 2.]) >>> profile_line(img, (1, 0), (1, 5)) # This accesses the full first row array([1., 1., 1., 2., 2., 2.])
对于不同的 reduce_func 输入
>>> profile_line(img, (1, 0), (1, 3), linewidth=3, reduce_func=np.mean) array([0.66666667, 0.66666667, 0.66666667, 1.33333333]) >>> profile_line(img, (1, 0), (1, 3), linewidth=3, reduce_func=np.max) array([1, 1, 1, 2]) >>> profile_line(img, (1, 0), (1, 3), linewidth=3, reduce_func=np.sum) array([2, 2, 2, 4])
当 reduce_func 为 None 或 reduce_func 对每个像素值单独作用时,将返回未简化的数组。
>>> profile_line(img, (1, 2), (4, 2), linewidth=3, order=0, ... reduce_func=None) array([[1, 1, 2], [1, 1, 2], [1, 1, 2], [0, 0, 0]]) >>> profile_line(img, (1, 0), (1, 3), linewidth=3, reduce_func=np.sqrt) array([[1. , 1. , 0. ], [1. , 1. , 0. ], [1. , 1. , 0. ], [1.41421356, 1.41421356, 0. ]])
- skimage.measure.ransac(data, model_class, min_samples, residual_threshold, is_data_valid=None, is_model_valid=None, max_trials=100, stop_sample_num=inf, stop_residuals_sum=0, stop_probability=1, rng=None, initial_inliers=None)[source]#
使用 RANSAC(随机抽样一致)算法将模型拟合到数据。
RANSAC 是一种迭代算法,用于从完整数据集的内点子集中稳健地估计参数。每次迭代执行以下任务:
从原始数据中选择 min_samples 个随机样本,并检查数据集是否有效(参见 is_data_valid)。
对随机子集估计模型(model_cls.estimate(*data[random_subset]),并检查估计的模型是否有效(参见 is_model_valid)。
通过计算与估计模型的残差将所有数据分类为内点或外点(model_cls.residuals(*data)) - 所有残差小于 residual_threshold 的数据样本都被视为内点。
如果内点样本数最大,则将估计的模型保存为最佳模型。如果当前估计的模型具有相同的内点数,则仅当它具有较小的残差和时,才将其视为最佳模型。
这些步骤要么执行最大次数,要么直到满足某个特定的停止条件。最终模型是使用先前确定的最佳模型的所有内点样本估计的。
- 参数:
- data[列表、元组] (N, …) 数组
拟合模型的数据集,其中 N 是数据点的数量,其余维度取决于模型的要求。如果模型类需要多个输入数据数组(例如
skimage.transform.AffineTransform
的源坐标和目标坐标),则可以选择将其作为元组或列表传递。请注意,在这种情况下,函数estimate(*data)
、residuals(*data)
、is_model_valid(model, *random_data)
和is_data_valid(*random_data)
必须将每个数据数组作为单独的参数。- model_class对象
具有以下对象方法的对象:
success = estimate(*data)
residuals(*data)
其中 success 指示模型估计是否成功(True 或 None 表示成功,False 表示失败)。
- min_samples范围 (0, N) 内的 int
拟合模型所需的最少数据点数。
- residual_threshold大于 0 的 float
将数据点分类为内点的最大距离。
- is_data_valid函数,可选
在对随机选择的数据拟合模型之前,会调用此函数:is_data_valid(*random_data)。
- is_model_valid函数,可选
此函数会使用估计的模型和随机选择的数据调用:is_model_valid(model, *random_data)。
- max_trialsint,可选
随机样本选择的最大迭代次数。
- stop_sample_numint,可选
如果找到至少此数量的内点,则停止迭代。
- stop_residuals_sumfloat,可选
如果残差和小于或等于此阈值,则停止迭代。
- stop_probability[0, 1] 范围内的 float,可选
如果至少一个无外点的训练数据集样本的概率 >= stop_probability,则 RANSAC 迭代停止,具体取决于当前最佳模型的内点比率和试验次数。这需要生成至少 N 个样本(试验次数)
N >= log(1 - probability) / log(1 - e**m)
其中概率(置信度)通常设置为一个较高的值,例如 0.99,e 是当前内点相对于样本总数的比例,m 是 min_samples 值。
- rng{
numpy.random.Generator
,int},可选 伪随机数生成器。默认情况下,使用 PCG64 生成器(参见
numpy.random.default_rng()
)。如果 rng 是一个整数,则将其用于为生成器设置种子。- initial_inliersbool 型类数组,形状 (N,),可选
模型估计的初始样本选择。
- 返回值:
- model对象
具有最大一致集的最佳模型。
- inliers(N,) 数组
分类为
True
的内点的布尔掩码。
参考文献
[1]“RANSAC”,维基百科,https://en.wikipedia.org/wiki/RANSAC
示例
生成无倾斜的椭圆数据并添加噪声。
>>> t = np.linspace(0, 2 * np.pi, 50) >>> xc, yc = 20, 30 >>> a, b = 5, 10 >>> x = xc + a * np.cos(t) >>> y = yc + b * np.sin(t) >>> data = np.column_stack([x, y]) >>> rng = np.random.default_rng(203560) # do not copy this value >>> data += rng.normal(size=data.shape)
添加一些错误数据。
>>> data[0] = (100, 100) >>> data[1] = (110, 120) >>> data[2] = (120, 130) >>> data[3] = (140, 130)
使用所有可用数据估计椭圆模型。
>>> model = EllipseModel() >>> model.estimate(data) True >>> np.round(model.params) array([ 72., 75., 77., 14., 1.])
使用 RANSAC 估计椭圆模型。
>>> ransac_model, inliers = ransac(data, EllipseModel, 20, 3, max_trials=50) >>> abs(np.round(ransac_model.params)) array([20., 30., 10., 6., 2.]) >>> inliers array([False, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True], dtype=bool) >>> sum(inliers) > 40 True
RANSAC 可用于稳健地估计几何变换。在本节中,我们还展示了如何使用样本总数的比例,而不是绝对数量。
>>> from skimage.transform import SimilarityTransform >>> rng = np.random.default_rng() >>> src = 100 * rng.random((50, 2)) >>> model0 = SimilarityTransform(scale=0.5, rotation=1, ... translation=(10, 20)) >>> dst = model0(src) >>> dst[0] = (10000, 10000) >>> dst[1] = (-100, 100) >>> dst[2] = (50, 50) >>> ratio = 0.5 # use half of the samples >>> min_samples = int(ratio * len(src)) >>> model, inliers = ransac( ... (src, dst), ... SimilarityTransform, ... min_samples, ... 10, ... initial_inliers=np.ones(len(src), dtype=bool), ... ) >>> inliers array([False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True])
基本矩阵估计。使用 RANSAC 进行稳健的直线模型估计。使用 RANSAC 进行稳健匹配。使用简单的图像拼接组装图像。
- skimage.measure.regionprops(label_image, intensity_image=None, cache=True, *, extra_properties=None, spacing=None, offset=None)[source]#
测量标记图像区域的属性。
- 参数:
- label_image(M, N[, P]) ndarray
标记的输入图像。值为 0 的标签将被忽略。
版本 0.14.1 中已更改: 之前,
label_image
由numpy.squeeze
处理,因此允许任何数量的单一维度。这导致对具有单一维度的图像处理不一致。要恢复旧的行为,请使用regionprops(np.squeeze(label_image), ...)
。- intensity_image(M, N[, P][, C]) ndarray,可选
强度(即输入)图像,大小与标记图像相同,另外可以选择为多通道数据添加一个额外的维度。目前,如果存在此额外的通道维度,则必须是最后一个轴。默认为 None。
版本 0.18.0 中已更改: 添加了提供额外通道维度的功能。
- cachebool,可选
确定是否缓存计算出的属性。缓存属性的计算速度快得多,而内存消耗会增加。
- extra_properties可调用的迭代器
添加 skimage 中未包含的额外属性计算函数。属性名称从函数名称派生,数据类型通过对一个小样本调用函数来推断。如果额外属性的名称与现有属性的名称冲突,则额外属性将不可见,并发出 UserWarning。属性计算函数必须将区域掩码作为其第一个参数。如果属性需要强度图像,则必须接受强度图像作为第二个参数。
- spacing: 浮点数元组,形状 (ndim,)
图像沿每个轴的像素间距。
- offsetint 型数组,形状为 (label_image.ndim,),可选
标记图像原点(“左上角”角)的坐标。通常为 ([0, ]0, 0),但如果想要获取较大体积内子体积的 regionprops,则可能不同。
- 返回值:
- propertiesRegionProperties 列表
每个项目描述一个标记区域,可以使用下面列出的属性进行访问。
另请参阅
注释
以下属性可以作为属性或键访问
- area浮点数
区域面积,即区域像素数乘以像素面积。
- area_bboxfloat
边界框面积,即边界框像素数乘以像素面积。
- area_convexfloat
凸包图像的面积,它是包围区域的最小凸多边形。
- area_filledfloat
填充所有孔洞后的区域面积。
- axis_major_lengthfloat
与区域具有相同归一化二阶中心矩的椭圆的长轴长度。
- axis_minor_lengthfloat
与区域具有相同归一化二阶中心矩的椭圆的短轴长度。
- bboxtuple
边界框
(min_row, min_col, max_row, max_col)
。属于边界框的像素位于半开区间[min_row; max_row)
和[min_col; max_col)
中。- centroidarray
质心坐标元组
(row, col)
。- centroid_localarray
质心坐标元组
(row, col)
,相对于区域边界框。- centroid_weightedarray
使用强度图像加权的质心坐标元组
(row, col)
。- centroid_weighted_localarray
相对于区域边界框,使用强度图像加权的质心坐标元组
(row, col)
。- coords_scaled(K, 2) ndarray
区域的坐标列表
(row, col)
,按spacing
缩放。- coords(K, 2) ndarray
区域的坐标列表
(row, col)
。- eccentricityfloat
与区域具有相同二阶矩的椭圆的偏心率。偏心率是焦距(焦点之间的距离)与长轴长度之比。该值在区间 [0, 1) 内。当它为 0 时,椭圆变成圆形。
- equivalent_diameter_areafloat
与区域具有相同面积的圆的直径。
- euler_number整数
非零像素集的欧拉示性数。计算为连接组件的数量减去孔洞的数量(input.ndim 连通性)。在 3D 中,连接组件的数量加上孔洞的数量减去隧道的数量。
- extentfloat
区域中像素与总边界框中像素的比率。计算为
area / (rows * cols)
- feret_diameter_maxfloat
最大费雷直径,计算为围绕区域凸包轮廓的点之间的最长距离,由
find_contours
确定。 [5]- image(H, J) ndarray
切片的二值区域图像,大小与边界框相同。
- image_convex(H, J) ndarray
二值凸包图像,大小与边界框相同。
- image_filled(H, J) ndarray
填充孔洞后的二值区域图像,大小与边界框相同。
- image_intensityndarray
区域内的图像。
- inertia_tensorndarray
区域围绕其质量旋转的惯性张量。
- inertia_tensor_eigvalstuple
惯性张量的特征值,按降序排列。
- intensity_maxfloat
区域中强度最大的值。
- intensity_meanfloat
区域中平均强度的值。
- intensity_minfloat
区域中强度最小的值。
- intensity_stdfloat
区域中强度的标准差。
- labelint
标记的输入图像中的标签。
- moments(3, 3) ndarray
高达 3 阶的空间矩
m_ij = sum{ array(row, col) * row^i * col^j }
其中,总和遍历区域的 row、col 坐标。
- moments_central(3, 3) ndarray
高达 3 阶的中心矩(平移不变)
mu_ij = sum{ array(row, col) * (row - row_c)^i * (col - col_c)^j }
其中,总和遍历区域的 row、col 坐标,而 row_c 和 col_c 是区域质心的坐标。
- moments_hutuple
Hu 矩(平移、缩放和旋转不变)。
- moments_normalized(3, 3) ndarray
高达 3 阶的归一化矩(平移和缩放不变)
nu_ij = mu_ij / m_00^[(i+j)/2 + 1]
其中,m_00 是零阶空间矩。
- moments_weighted(3, 3) ndarray
高达 3 阶的强度图像空间矩
wm_ij = sum{ array(row, col) * row^i * col^j }
其中,总和遍历区域的 row、col 坐标。
- moments_weighted_central(3, 3) ndarray
高达 3 阶的强度图像中心矩(平移不变)
wmu_ij = sum{ array(row, col) * (row - row_c)^i * (col - col_c)^j }
其中,总和遍历区域的 row、col 坐标,而 row_c 和 col_c 是区域加权质心的坐标。
- moments_weighted_hutuple
强度图像的 Hu 矩(平移、缩放和旋转不变)。
- moments_weighted_normalized(3, 3) ndarray
高达 3 阶的强度图像归一化矩(平移和缩放不变)
wnu_ij = wmu_ij / wm_00^[(i+j)/2 + 1]
其中,
wm_00
是零阶空间矩(强度加权面积)。- num_pixelsint
前景像素的数量。
- orientationfloat
第 0 轴(行)与与区域具有相同二阶矩的椭圆的长轴之间的角度,范围从 -pi/2 到 pi/2 逆时针方向。
- perimeter浮点数
对象的周长,它将轮廓近似为通过边界像素中心的线,使用 4 连通性。
- perimeter_croftonfloat
使用 4 个方向的 Crofton 公式近似的对象周长。
- slice切片元组
从源图像中提取对象的切片。
- solidityfloat
区域中像素与凸包图像中像素的比率。
每个区域也支持迭代,因此您可以执行
for prop in region: print(prop, region[prop])
参考文献
[1]Wilhelm Burger,Mark Burge。数字图像处理原理:核心算法。施普林格出版社,伦敦,2009 年。
[2]B. Jähne。数字图像处理。施普林格出版社,柏林-海德堡,第 6 版,2005 年。
[3]T. H. Reiss。使用不变图像特征识别平面对象,来自计算机科学讲义,第 676 页。施普林格出版社,柏林,1993 年。
[5]W. Pabst,E. Gregorová。颗粒和颗粒体系的表征,第 27-28 页。ICT 布拉格,2007 年。 https://old.vscht.cz/sil/keramika/Characterization_of_particles/CPPS%20_English%20version_.pdf
示例
>>> from skimage import data, util >>> from skimage.measure import label, regionprops >>> img = util.img_as_ubyte(data.coins()) > 110 >>> label_img = label(img, connectivity=img.ndim) >>> props = regionprops(label_img) >>> # centroid of first labeled object >>> props[0].centroid (22.72987986048314, 81.91228523446583) >>> # centroid of first labeled object >>> props[0]['centroid'] (22.72987986048314, 81.91228523446583)
通过将函数作为
extra_properties
传递来添加自定义测量值>>> from skimage import data, util >>> from skimage.measure import label, regionprops >>> import numpy as np >>> img = util.img_as_ubyte(data.coins()) > 110 >>> label_img = label(img, connectivity=img.ndim) >>> def pixelcount(regionmask): ... return np.sum(regionmask) >>> props = regionprops(label_img, extra_properties=(pixelcount,)) >>> props[0].pixelcount 7741 >>> props[1]['pixelcount'] 42
- skimage.measure.regionprops_table(label_image, intensity_image=None, properties=('label', 'bbox'), *, cache=True, separator='-', extra_properties=None, spacing=None)[source]#
计算图像属性并将其作为与 pandas 兼容的表格返回。
该表是一个字典,将列名映射到值数组。有关详细信息,请参见下面的“注释”部分。
版本 0.16 中新增。
- 参数:
- label_image(M, N[, P]) ndarray
标记的输入图像。值为 0 的标签将被忽略。
- intensity_image(M, N[, P][, C]) ndarray,可选
强度(即输入)图像,大小与标记图像相同,另外可以选择为多通道数据添加一个额外的维度。如果存在通道维度,则必须是最后一个轴。默认为 None。
版本 0.18.0 中已更改: 添加了提供额外通道维度的功能。
- properties元组或字符串列表,可选
将包含在结果字典中的属性。有关可用属性的列表,请参阅
regionprops()
。用户应记住添加“label”以跟踪区域标识。- cachebool,可选
确定是否缓存计算出的属性。缓存属性的计算速度快得多,而内存消耗会增加。
- separatorstr,可选
对于未在 OBJECT_COLUMNS 中列出的非标量属性,每个元素都将出现在其自己的列中,该元素的索引通过此分隔符与属性名称分隔。例如,二维区域的惯性张量将出现在四列中:
inertia_tensor-0-0
、inertia_tensor-0-1
、inertia_tensor-1-0
和inertia_tensor-1-1
(其中分隔符为-
)。对象列是那些无法以这种方式拆分,因为列数会根据对象而变化的列。例如,
image
和coords
。- extra_properties可调用的迭代器
添加 skimage 中未包含的额外属性计算函数。属性名称从函数名称派生,数据类型通过对一个小样本调用函数来推断。如果额外属性的名称与现有属性的名称冲突,则额外属性将不可见,并发出 UserWarning。属性计算函数必须将区域掩码作为其第一个参数。如果属性需要强度图像,则必须接受强度图像作为第二个参数。
- spacing: 浮点数元组,形状 (ndim,)
图像沿每个轴的像素间距。
- 返回值:
- out_dictdict
将属性名称映射到该属性值数组的字典,每个区域一个值。此字典可用作 pandas
DataFrame
的输入,以将属性名称映射到框架中的列,并将区域映射到行。如果图像没有区域,则数组长度为 0,但类型正确。
注释
每列包含标量属性、对象属性或多维数组中的元素。
具有每个区域标量值的属性(例如“eccentricity”)将显示为具有该属性名称作为键的浮点数或整数数组。
对于给定图像维度具有固定大小的多维属性,例如“centroid”(无论区域大小如何,每个质心在 3D 图像中都将具有三个元素),将拆分为多个列,名称为 {property_name}{separator}{element_num}(对于一维属性)、{property_name}{separator}{elem_num0}{separator}{elem_num1}(对于二维属性),依此类推。
对于没有固定大小的多维属性,例如“image”(区域的图像大小根据区域大小而变化),将使用对象数组,并使用相应的属性名称作为键。
示例
>>> from skimage import data, util, measure >>> image = data.coins() >>> label_image = measure.label(image > 110, connectivity=image.ndim) >>> props = measure.regionprops_table(label_image, image, ... properties=['label', 'inertia_tensor', ... 'inertia_tensor_eigvals']) >>> props {'label': array([ 1, 2, ...]), ... 'inertia_tensor-0-0': array([ 4.012...e+03, 8.51..., ...]), ... ..., 'inertia_tensor_eigvals-1': array([ 2.67...e+02, 2.83..., ...])}
如果已安装,则可以将结果字典直接传递给 pandas 以获得干净的 DataFrame
>>> import pandas as pd >>> data = pd.DataFrame(props) >>> data.head() label inertia_tensor-0-0 ... inertia_tensor_eigvals-1 0 1 4012.909888 ... 267.065503 1 2 8.514739 ... 2.834806 2 3 0.666667 ... 0.000000 3 4 0.000000 ... 0.000000 4 5 0.222222 ... 0.111111
[5 行 x 7 列]
如果我们想测量不作为内置属性提供的特征,我们可以定义自定义函数并将其作为
extra_properties
传递。例如,我们可以创建一个自定义函数来测量区域中的强度四分位数。>>> from skimage import data, util, measure >>> import numpy as np >>> def quartiles(regionmask, intensity): ... return np.percentile(intensity[regionmask], q=(25, 50, 75)) >>> >>> image = data.coins() >>> label_image = measure.label(image > 110, connectivity=image.ndim) >>> props = measure.regionprops_table(label_image, intensity_image=image, ... properties=('label',), ... extra_properties=(quartiles,)) >>> import pandas as pd >>> pd.DataFrame(props).head() label quartiles-0 quartiles-1 quartiles-2 0 1 117.00 123.0 130.0 1 2 111.25 112.0 114.0 2 3 111.00 111.0 111.0 3 4 111.00 111.5 112.5 4 5 112.50 113.0 114.0
使用 pandas 探索和可视化区域属性测量区域属性跟踪金属合金的凝固过程测量核膜处的荧光强度
- skimage.measure.shannon_entropy(image, base=2)[source]#
计算图像的香农熵。
香农熵定义为 S = -sum(pk * log(pk)),其中 pk 是值为 k 的像素的频率/概率。
- 参数:
- image(M, N) ndarray
灰度输入图像。
- basefloat,可选
要使用的对数底数。
- 返回值:
- entropyfloat
注释
返回值以比特或香农 (Sh)(对于 base=2)、自然单位 (nat)(对于 base=np.e)和哈特利 (Hart)(对于 base=10)为单位测量。
参考文献
示例
>>> from skimage import data >>> from skimage.measure import shannon_entropy >>> shannon_entropy(data.camera()) 7.231695011055706
- skimage.measure.subdivide_polygon(coords, degree=2, preserve_ends=False)[source]#
使用 B 样条曲线细分多边形曲线。
请注意,生成的曲线始终位于原始多边形的凸包内。圆形多边形在细分后保持闭合。
- 参数:
- coords(K, 2) 数组
坐标数组。
- degree{1, 2, 3, 4, 5, 6, 7},可选
B 样条的次数。默认为 2。
- preserve_endsbool,可选
保留非圆形多边形的第一个和最后一个坐标。默认为 False。
- 返回值:
- coords(L, 2) 数组
细分的坐标数组。
参考文献
近似和细分多边形
- class skimage.measure.CircleModel[source]#
基类:
BaseModel
二维圆的总体最小二乘估计器。
圆的函数模型为
r**2 = (x - xc)**2 + (y - yc)**2
此估计器最小化所有点到圆的平方距离
min{ sum((r - sqrt((x_i - xc)**2 + (y_i - yc)**2))**2) }
需要至少 3 个点才能求解参数。
注释
估计是使用 [1] 中给出的球形估计的二维版本进行的。
参考文献
[1]Jekel,Charles F. 获取 PVC 涂层聚酯的非线性正交各向异性材料模型通过反向气泡膨胀。论文(MEng),斯泰伦博斯大学,2016 年。附录 A,第 83-87 页。https://hdl.handle.net/10019.1/98627
示例
>>> t = np.linspace(0, 2 * np.pi, 25) >>> xy = CircleModel().predict_xy(t, params=(2, 3, 4)) >>> model = CircleModel() >>> model.estimate(xy) True >>> tuple(np.round(model.params, 5)) (2.0, 3.0, 4.0) >>> res = model.residuals(xy) >>> np.abs(np.round(res, 9)) array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
- 属性:
- paramstuple
圆模型参数,顺序为 xc、yc、r。
- estimate(data)[source]#
使用总体最小二乘法从数据估计圆模型。
- 参数:
- data(N, 2) 数组
N 个点,分别具有
(x, y)
坐标。
- 返回值:
- successbool
如果模型估计成功,则为 True。
- class skimage.measure.EllipseModel[source]#
基类:
BaseModel
二维椭圆的总体最小二乘估计器。
椭圆的函数模型为
xt = xc + a*cos(theta)*cos(t) - b*sin(theta)*sin(t) yt = yc + a*sin(theta)*cos(t) + b*cos(theta)*sin(t) d = sqrt((x - xt)**2 + (y - yt)**2)
其中
(xt, yt)
是椭圆上最接近(x, y)
的点。因此,d 是点到椭圆的最短距离。估计器基于最小二乘最小化。直接计算最优解,不需要迭代。这导致了一种简单、稳定和稳健的拟合方法。
该
params
属性包含以下顺序的参数xc, yc, a, b, theta
示例
>>> xy = EllipseModel().predict_xy(np.linspace(0, 2 * np.pi, 25), ... params=(10, 15, 8, 4, np.deg2rad(30))) >>> ellipse = EllipseModel() >>> ellipse.estimate(xy) True >>> np.round(ellipse.params, 2) array([10. , 15. , 8. , 4. , 0.52]) >>> np.round(abs(ellipse.residuals(xy)), 5) array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
- 属性:
- paramstuple
椭圆模型参数,顺序为 xc、yc、a、b、theta。
- estimate(data)[source]#
使用总体最小二乘法从数据估计椭圆模型。
- 参数:
- data(N, 2) 数组
N 个点,分别具有
(x, y)
坐标。
- 返回值:
- successbool
如果模型估计成功,则为 True。
参考文献
[1]Halir,R.;Flusser,J.“椭圆的数值稳定直接最小二乘拟合”。在中欧计算机图形和可视化第六届国际会议论文集中。WSCG(第 98 卷,第 125-132 页)。
- class skimage.measure.LineModelND[source]#
基类:
BaseModel
N 维直线的总体最小二乘估计器。
与普通最小二乘法直线估计相反,此估计器最小化点到估计直线的正交距离。
直线由一个点(原点)和一个单位向量(方向)根据以下向量方程定义
X = origin + lambda * direction
示例
>>> x = np.linspace(1, 2, 25) >>> y = 1.5 * x + 3 >>> lm = LineModelND() >>> lm.estimate(np.stack([x, y], axis=-1)) True >>> tuple(np.round(lm.params, 5)) (array([1.5 , 5.25]), array([0.5547 , 0.83205])) >>> res = lm.residuals(np.stack([x, y], axis=-1)) >>> np.abs(np.round(res, 9)) array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) >>> np.round(lm.predict_y(x[:5]), 3) array([4.5 , 4.562, 4.625, 4.688, 4.75 ]) >>> np.round(lm.predict_x(y[:5]), 3) array([1. , 1.042, 1.083, 1.125, 1.167])
- 属性:
- paramstuple
直线模型参数按以下顺序排列:origin、direction。
- estimate(data)[source]#
从数据中估计直线模型。
这最小化了给定数据点到估计直线的最短(正交)距离之和。
- 参数:
- data(N, dim) 数组
维度 dim >= 2 的空间中的 N 个点。
- 返回值:
- successbool
如果模型估计成功,则为 True。
- predict(x, axis=0, params=None)[source]#
预测估计直线模型与垂直于给定轴的超平面的交点。
- 参数:
- x(n, 1) 数组
沿轴的坐标。
- axis整数
垂直于与直线相交的超平面的轴。
- params(2,) 数组,可选
可选的自定义参数集,格式为 (origin, direction)。
- 返回值:
- data(n, m) 数组
预测的坐标。
- 引发:
- ValueError
如果直线平行于给定的轴。
- predict_x(y, params=None)[source]#
使用估计模型预测二维直线的 x 坐标。
别名
predict(y, axis=1)[:, 0]
- 参数:
- y数组
y 坐标。
- params(2,) 数组,可选
可选的自定义参数集,格式为 (origin, direction)。
- 返回值:
- x数组
预测的 x 坐标。