skimage.draw
#
绘制基元,例如线条、圆形、文本等。
生成贝塞尔曲线坐标。 |
|
生成圆周坐标。 |
|
生成抗锯齿圆周坐标。 |
|
生成圆内像素的坐标。 |
|
生成椭圆内像素的坐标。 |
|
生成椭圆周坐标。 |
|
生成给定半轴长度的椭球体。 |
|
计算椭球体的解析体积和表面积。 |
|
生成线像素坐标。 |
|
生成抗锯齿线像素坐标。 |
|
在 n 维中绘制单像素粗细的线。 |
|
生成多边形内像素的坐标。 |
|
从多边形创建二进制掩码。 |
|
生成多边形周界坐标。 |
|
生成具有随机形状的图像,并用边界框标记。 |
|
生成矩形内像素的坐标。 |
|
生成正好在矩形周围的像素坐标。 |
|
在给定坐标处设置图像中的像素颜色。 |
- skimage.draw.bezier_curve(r0, c0, r1, c1, r2, c2, weight, shape=None)[源代码]#
生成贝塞尔曲线坐标。
- 参数:
- r0, c0int
第一个控制点的坐标。
- r1, c1int
中间控制点的坐标。
- r2, c2int
最后一个控制点的坐标。
- weightdouble
中间控制点权重,它描述了线条的张力。
- shapetuple, 可选
用于确定输出像素坐标最大范围的图像形状。这对于超出图像大小的曲线很有用。如果为 None,则使用曲线的完整范围。
- 返回:
- rr, cc(N,) int 类型的 ndarray
属于贝塞尔曲线的像素的索引。可用于直接索引到数组中,例如
img[rr, cc] = 1
。
注释
该算法是参考文献[1]中提出的有理二次算法。
参考文献
[1]A Rasterizing Algorithm for Drawing Curves, A. Zingl, 2012 http://members.chello.at/easyfilter/Bresenham.pdf
示例
>>> import numpy as np >>> from skimage.draw import bezier_curve >>> img = np.zeros((10, 10), dtype=np.uint8) >>> rr, cc = bezier_curve(1, 5, 5, -2, 8, 8, 2) >>> img[rr, cc] = 1 >>> img array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
形状
- skimage.draw.circle_perimeter(r, c, radius, method='bresenham', shape=None)[源代码]#
生成圆周坐标。
- 参数:
- r, cint
圆的中心坐标。
- radiusint
圆的半径。
- method{‘bresenham’, ‘andres’}, 可选
bresenham : Bresenham 方法(默认) andres : Andres 方法
- shapetuple, 可选
用于确定输出像素坐标最大范围的图像形状。这对于超出图像大小的圆很有用。如果为 None,则使用圆的完整范围。必须至少为长度 2。仅使用前两个值来确定输入图像的范围。
- 返回:
- rr, cc(N,) int 类型的 ndarray
Bresenham 和 Andres 的方法:属于圆周的像素的索引。可用于直接索引到数组中,例如
img[rr, cc] = 1
。
注释
Andres 方法的优点是同心圆会创建一个圆盘,而 Bresenham 可能会产生孔洞。当 Andres 圆旋转时,失真也较少。Bresenham 方法也称为中点圆算法。抗锯齿圆生成器可使用
circle_perimeter_aa
。参考文献
[1]J.E. Bresenham, “Algorithm for computer control of a digital plotter”, IBM Systems journal, 4 (1965) 25-30.
[2]E. Andres, “Discrete circles, rings and spheres”, Computers & Graphics, 18 (1994) 695-706.
示例
>>> from skimage.draw import circle_perimeter >>> img = np.zeros((10, 10), dtype=np.uint8) >>> rr, cc = circle_perimeter(4, 4, 3) >>> img[rr, cc] = 1 >>> img array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 1, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 1, 0, 0], [0, 1, 0, 0, 0, 0, 0, 1, 0, 0], [0, 1, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
形状圆形和椭圆形霍夫变换
- skimage.draw.circle_perimeter_aa(r, c, radius, shape=None)[源代码]#
生成抗锯齿圆周坐标。
- 参数:
- r, cint
圆的中心坐标。
- radiusint
圆的半径。
- shapetuple, 可选
用于确定输出像素坐标最大范围的图像形状。这对于超出图像大小的圆很有用。如果为 None,则使用圆的完整范围。必须至少为长度 2。仅使用前两个值来确定输入图像的范围。
- 返回:
- rr, cc, val(N,) ndarray (int, int, float)
像素的索引(
rr
,cc
)和强度值(val
)。img[rr, cc] = val
。
注释
Wu 的方法绘制抗锯齿圆。此实现不使用查找表优化。
使用函数
draw.set_color
将circle_perimeter_aa
结果应用于彩色图像。参考文献
[1]X. Wu, “An efficient antialiasing technique”, In ACM SIGGRAPH Computer Graphics, 25 (1991) 143-152.
示例
>>> from skimage.draw import circle_perimeter_aa >>> img = np.zeros((10, 10), dtype=np.uint8) >>> rr, cc, val = circle_perimeter_aa(4, 4, 3) >>> img[rr, cc] = val * 255 >>> img array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 60, 211, 255, 211, 60, 0, 0, 0], [ 0, 60, 194, 43, 0, 43, 194, 60, 0, 0], [ 0, 211, 43, 0, 0, 0, 43, 211, 0, 0], [ 0, 255, 0, 0, 0, 0, 0, 255, 0, 0], [ 0, 211, 43, 0, 0, 0, 43, 211, 0, 0], [ 0, 60, 194, 43, 0, 43, 194, 60, 0, 0], [ 0, 0, 60, 211, 255, 211, 60, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
>>> from skimage import data, draw >>> image = data.chelsea() >>> rr, cc, val = draw.circle_perimeter_aa(r=100, c=100, radius=75) >>> draw.set_color(image, (rr, cc), [1, 0, 0], alpha=val)
形状
- skimage.draw.disk(center, radius, *, shape=None)[源代码]#
生成圆内像素的坐标。
- 参数:
- centertuple
圆盘的中心坐标。
- radiusdouble
圆盘的半径。
- shapetuple, 可选
图像形状为大小为 2 的元组。确定输出像素坐标的最大范围。这对于超出图像大小的圆盘很有用。如果为 None,则使用圆盘的完整范围。该形状可能会导致负坐标和环绕行为。
- 返回:
- rr, ccint 类型的 ndarray
圆盘的像素坐标。可用于直接索引到数组中,例如
img[rr, cc] = 1
。
示例
>>> import numpy as np >>> from skimage.draw import disk >>> shape = (4, 4) >>> img = np.zeros(shape, dtype=np.uint8) >>> rr, cc = disk((0, 0), 2, shape=shape) >>> img[rr, cc] = 1 >>> img array([[1, 1, 0, 0], [1, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], dtype=uint8) >>> img = np.zeros(shape, dtype=np.uint8) >>> # Negative coordinates in rr and cc perform a wraparound >>> rr, cc = disk((0, 0), 2, shape=None) >>> img[rr, cc] = 1 >>> img array([[1, 1, 0, 1], [1, 1, 0, 1], [0, 0, 0, 0], [1, 1, 0, 1]], dtype=uint8) >>> img = np.zeros((10, 10), dtype=np.uint8) >>> rr, cc = disk((4, 4), 5) >>> img[rr, cc] = 1 >>> img array([[0, 0, 1, 1, 1, 1, 1, 0, 0, 0], [0, 1, 1, 1, 1, 1, 1, 1, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [0, 1, 1, 1, 1, 1, 1, 1, 0, 0], [0, 0, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
- skimage.draw.ellipse(r, c, r_radius, c_radius, shape=None, rotation=0.0)[源代码]#
生成椭圆内像素的坐标。
- 参数:
- r, cdouble
椭圆的中心坐标。
- r_radius, c_radius双精度浮点数
短半轴和长半轴。
(r/r_radius)**2 + (c/c_radius)**2 = 1
。- shapetuple, 可选
用于确定输出像素坐标最大范围的图像形状。 这对于超出图像大小的椭圆很有用。 默认情况下,使用椭圆的全部范围。 必须至少为长度 2。 仅使用前两个值来确定范围。
- rotation浮点数,可选(默认 0.)
设置椭圆的旋转角度(rotation),范围为 (-PI, PI),逆时针方向,因此 PI/2 度意味着交换椭圆轴
- 返回:
- rr, ccint 类型的 ndarray
椭圆的像素坐标。 可用于直接索引到数组中,例如
img[rr, cc] = 1
。
注释
椭圆方程
((x * cos(alpha) + y * sin(alpha)) / x_radius) ** 2 + ((x * sin(alpha) - y * cos(alpha)) / y_radius) ** 2 = 1
请注意,在未指定
shape
的情况下,ellipse
的位置也可能具有负值,因为这在平面上是正确的。 另一方面,之后将这些椭圆位置用于图像可能会导致出现在图像的另一侧,因为image[-1, -1] = image[end-1, end-1]
>>> rr, cc = ellipse(1, 2, 3, 6) >>> img = np.zeros((6, 12), dtype=np.uint8) >>> img[rr, cc] = 1 >>> img array([[1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1]], dtype=uint8)
示例
>>> from skimage.draw import ellipse >>> img = np.zeros((10, 12), dtype=np.uint8) >>> rr, cc = ellipse(5, 6, 3, 5, rotation=np.deg2rad(30)) >>> img[rr, cc] = 1 >>> img 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, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0], [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0], [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0], [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0], [0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
- skimage.draw.ellipse_perimeter(r, c, r_radius, c_radius, orientation=0, shape=None)[source]#
生成椭圆周坐标。
- 参数:
- r, cint
椭圆的中心坐标。
- r_radius, c_radius整数
短半轴和长半轴。
(r/r_radius)**2 + (c/c_radius)**2 = 1
。- orientation双精度浮点数,可选
主轴方向,以弧度表示,顺时针方向。
- shapetuple, 可选
用于确定输出像素坐标最大范围的图像形状。 这对于超出图像大小的椭圆很有用。 如果为 None,则使用椭圆的全部范围。 必须至少为长度 2。 仅使用前两个值来确定输入图像的范围。
- 返回:
- rr, cc(N,) int 类型的 ndarray
属于椭圆周长的像素的索引。 可用于直接索引到数组中,例如
img[rr, cc] = 1
。
参考文献
[1]A Rasterizing Algorithm for Drawing Curves, A. Zingl, 2012 http://members.chello.at/easyfilter/Bresenham.pdf
示例
>>> from skimage.draw import ellipse_perimeter >>> img = np.zeros((10, 10), dtype=np.uint8) >>> rr, cc = ellipse_perimeter(5, 5, 3, 4) >>> img[rr, cc] = 1 >>> img array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0, 1, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 1, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 1, 1, 1, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
请注意,在未指定
shape
的情况下,ellipse
的位置也可能具有负值,因为这在平面上是正确的。 另一方面,之后将这些椭圆位置用于图像可能会导致出现在图像的另一侧,因为image[-1, -1] = image[end-1, end-1]
>>> rr, cc = ellipse_perimeter(2, 3, 4, 5) >>> img = np.zeros((9, 12), dtype=np.uint8) >>> img[rr, cc] = 1 >>> img array([[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]], dtype=uint8)
形状圆形和椭圆形霍夫变换
- skimage.draw.ellipsoid(a, b, c, spacing=(1.0, 1.0, 1.0), levelset=False)[source]#
生成给定半轴长度的椭球体。
各个半轴长度沿笛卡尔坐标中的三个维度给出。 每个维度可以使用不同的网格间距。
- 参数:
- a浮点数
沿 x 轴的半轴长度。
- b浮点数
沿 y 轴的半轴长度。
- c浮点数
沿 z 轴的半轴长度。
- spacing由浮点数组成的 3 元组
三个空间维度中的网格间距。
- levelset布尔值
如果为 True,则返回此椭球的水平集(关于零的有符号水平集,正值表示内部),类型为 np.float64。 False 返回所述水平集的二值化版本。
- 返回:
- ellipsoid(M, N, P) 数组
对于给定的
spacing
,以正确大小的数组为中心放置的椭球。 布尔数据类型,除非levelset=True
,在这种情况下,返回一个浮点数数组,其中高于 0.0 的水平集表示椭球。
行进立方体
- skimage.draw.ellipsoid_stats(a, b, c)[source]#
计算椭球体的解析体积和表面积。
椭球的表面积由下式给出
\[S=4\pi b c R_G\!\left(1, \frac{a^2}{b^2}, \frac{a^2}{c^2}\right)\]其中 \(R_G\) 是 Carlson 的第二类完全对称椭圆积分 [1]。 后者实现为
scipy.special.elliprg()
。- 参数:
- a浮点数
沿 x 轴的半轴长度。
- b浮点数
沿 y 轴的半轴长度。
- c浮点数
沿 z 轴的半轴长度。
- 返回:
- vol浮点数
计算出的椭球体积。
- surf浮点数
计算出的椭球表面积。
参考文献
[1]Paul Masson (2020)。 椭球的表面积。 https://analyticphysics.com/Mathematical%20Methods/Surface%20Area%20of%20an%20Ellipsoid.htm
- skimage.draw.line(r0, c0, r1, c1)[source]#
生成线像素坐标。
- 参数:
- r0, c0int
起始位置(行,列)。
- r1, c1int
结束位置(行,列)。
- 返回:
- rr, cc(N,) int 类型的 ndarray
属于该线的像素的索引。 可用于直接索引到数组中,例如
img[rr, cc] = 1
。
注释
抗锯齿线生成器可使用
line_aa
。示例
>>> from skimage.draw import line >>> img = np.zeros((10, 10), dtype=np.uint8) >>> rr, cc = line(1, 1, 8, 8) >>> img[rr, cc] = 1 >>> img array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
- skimage.draw.line_aa(r0, c0, r1, c1)[source]#
生成抗锯齿线像素坐标。
- 参数:
- r0, c0int
起始位置(行,列)。
- r1, c1int
结束位置(行,列)。
- 返回:
- rr, cc, val(N,) ndarray (int, int, float)
像素的索引(
rr
,cc
)和强度值(val
)。img[rr, cc] = val
。
参考文献
[1]A Rasterizing Algorithm for Drawing Curves, A. Zingl, 2012 http://members.chello.at/easyfilter/Bresenham.pdf
示例
>>> from skimage.draw import line_aa >>> img = np.zeros((10, 10), dtype=np.uint8) >>> rr, cc, val = line_aa(1, 1, 8, 8) >>> img[rr, cc] = val * 255 >>> img array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 255, 74, 0, 0, 0, 0, 0, 0, 0], [ 0, 74, 255, 74, 0, 0, 0, 0, 0, 0], [ 0, 0, 74, 255, 74, 0, 0, 0, 0, 0], [ 0, 0, 0, 74, 255, 74, 0, 0, 0, 0], [ 0, 0, 0, 0, 74, 255, 74, 0, 0, 0], [ 0, 0, 0, 0, 0, 74, 255, 74, 0, 0], [ 0, 0, 0, 0, 0, 0, 74, 255, 74, 0], [ 0, 0, 0, 0, 0, 0, 0, 74, 255, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
形状
- skimage.draw.line_nd(start, stop, *, endpoint=False, integer=True)[source]#
在 n 维中绘制单像素粗细的线。
生成的线将是 ndim 连接的。 也就是说,线中两个连续的像素将是 n 维中的直接或对角邻居。
- 参数:
- start类数组,形状 (N,)
线的起始坐标。
- stop类数组,形状 (N,)
线的结束坐标。
- endpoint布尔值,可选
是否在返回的线中包含端点。 默认为 False,这便于绘制多点路径。
- integer布尔值,可选
是否将坐标四舍五入为整数。 如果为 True(默认值),则返回的坐标可用于直接索引到数组中。
False
可用于例如矢量绘图。
- 返回:
- coords数组元组
线上点的坐标。
示例
>>> lin = line_nd((1, 1), (5, 2.5), endpoint=False) >>> lin (array([1, 2, 3, 4]), array([1, 1, 2, 2])) >>> im = np.zeros((6, 5), dtype=int) >>> im[lin] = 1 >>> im array([[0, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0]]) >>> line_nd([2, 1, 1], [5, 5, 2.5], endpoint=True) (array([2, 3, 4, 4, 5]), array([1, 2, 3, 4, 5]), array([1, 1, 2, 2, 2]))
- skimage.draw.polygon(r, c, shape=None)[source]#
生成多边形内像素的坐标。
- 参数:
- r(N,) 类数组
多边形顶点的行坐标。
- c(N,) 类数组
多边形顶点的列坐标。
- shapetuple, 可选
图像形状,用于确定输出像素坐标的最大范围。这对于超出图像大小的多边形很有用。如果为 None,则使用多边形的完整范围。必须至少为长度 2。只有前两个值用于确定输入图像的范围。
- 返回:
- rr, ccint 类型的 ndarray
多边形的像素坐标。 可用于直接索引数组,例如
img[rr, cc] = 1
。
另请参阅
polygon2mask
从多边形创建二进制掩码。
注释
此函数确保
rr
和cc
不包含负值。坐标小于 0 的多边形像素不会被绘制。示例
>>> import skimage as ski >>> r = np.array([1, 2, 8]) >>> c = np.array([1, 7, 4]) >>> rr, cc = ski.draw.polygon(r, c) >>> img = np.zeros((10, 10), dtype=int) >>> img[rr, cc] = 1 >>> img array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 1, 1, 1, 1, 0, 0], [0, 0, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 1, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
如果定义了图像
shape
,并且polygon
的顶点/点位于此坐标空间之外,则仅返回多边形的部分(或全部不返回)像素。通过偏移量移动多边形的顶点可以用于移动多边形,并可能绘制多边形的任意子区域。>>> offset = (2, -4) >>> rr, cc = ski.draw.polygon(r - offset[0], c - offset[1], shape=img.shape) >>> img = np.zeros((10, 10), dtype=int) >>> img[rr, cc] = 1 >>> img array([[0, 0, 0, 0, 0, 0, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0]])
形状
- skimage.draw.polygon2mask(image_shape, polygon)[源代码]#
从多边形创建二进制掩码。
- 参数:
- image_shape大小为 2 的元组
掩码的形状。
- polygon(N, 2) 类数组
形状为 (N, 2) 的多边形坐标,其中 N 是点的数量。坐标为 (行,列)。
- 返回:
- mask类型为“bool”的二维 ndarray
与输入多边形对应的二进制掩码。
另请参阅
polygon
生成多边形内像素的坐标。
注释
此函数不执行任何边界检查。多边形中位于
image_shape
定义的坐标空间之外的部分不会被绘制。示例
>>> import skimage as ski >>> image_shape = (10, 10) >>> polygon = np.array([[1, 1], [2, 7], [8, 4]]) >>> mask = ski.draw.polygon2mask(image_shape, polygon) >>> mask.astype(int) array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 1, 1, 1, 1, 0, 0], [0, 0, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 1, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
如果
polygon
的顶点/点位于image_shape
定义的坐标空间之外,则仅在掩码中绘制多边形的部分(或全部不绘制)。>>> offset = np.array([[2, -4]]) >>> ski.draw.polygon2mask(image_shape, polygon - offset).astype(int) array([[0, 0, 0, 0, 0, 0, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0]])
- skimage.draw.polygon_perimeter(r, c, shape=None, clip=False)[源代码]#
生成多边形周界坐标。
- 参数:
- r(N,) ndarray
多边形顶点的行坐标。
- c(N,) ndarray
多边形顶点的列坐标。
- shapetuple, 可选
图像形状,用于确定输出像素坐标的最大范围。这对于超出图像大小的多边形很有用。如果为 None,则使用多边形的完整范围。必须至少为长度 2。只有前两个值用于确定输入图像的范围。
- clipbool,可选
是否将多边形裁剪到提供的形状。如果将其设置为 True,则绘制的图形将始终是具有所有可见边的闭合多边形。
- 返回:
- rr, ccint 类型的 ndarray
多边形的像素坐标。 可用于直接索引数组,例如
img[rr, cc] = 1
。
示例
>>> from skimage.draw import polygon_perimeter >>> img = np.zeros((10, 10), dtype=np.uint8) >>> rr, cc = polygon_perimeter([5, -1, 5, 10], ... [-1, 5, 11, 5], ... shape=img.shape, clip=True) >>> img[rr, cc] = 1 >>> img array([[0, 0, 0, 0, 1, 1, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0, 1, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 1, 1, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 1, 0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 1, 1, 1, 0, 0, 0]], dtype=uint8)
- skimage.draw.random_shapes(image_shape, max_shapes, min_shapes=1, min_size=2, max_size=None, num_channels=3, shape=None, intensity_range=None, allow_overlap=False, num_trials=100, rng=None, *, channel_axis=-1)[源代码]#
生成具有随机形状的图像,并用边界框标记。
使用随机大小、随机位置和随机颜色(有或没有重叠)填充图像。
形状具有随机 (行,列) 起始坐标,以及由
min_size
和max_size
限定的随机大小。可能会出现随机生成的形状根本不适合图像的情况。在这种情况下,算法将使用新的起始坐标尝试多次。但是,这也意味着某些形状可能会被完全跳过。在这种情况下,此函数将生成比请求的形状更少的形状。- 参数:
- image_shape元组
要生成的图像的行数和列数。
- max_shapesint
要(尝试)放入形状的最大形状数。
- min_shapesint,可选
要(尝试)放入形状的最小形状数。
- min_sizeint,可选
要放入图像的每个形状的最小尺寸。
- max_sizeint,可选
要放入图像的每个形状的最大尺寸。
- num_channelsint,可选
生成图像中的通道数。如果为 1,则生成单色图像,否则生成具有多个通道的彩色图像。如果将
multichannel
设置为 False,则忽略此参数。- shape{rectangle, circle, triangle, ellipse, None} str,可选
要生成的形状的名称,或
None
以选择随机形状。- intensity_range{uint8 的元组的元组,uint8 的元组},可选
从中采样像素值的范围。对于灰度图像,格式为 (最小值,最大值)。对于多通道 - ((最小值,最大值),) 如果范围在通道中相等,以及 ((min_0, max_0), … (min_N, max_N)) 如果它们不同。由于该函数仅支持生成 uint8 数组,因此最大范围为 (0, 255)。如果为 None,则为每个通道设置为 (0, 254),保留强度 = 255 的颜色作为背景。
- allow_overlapbool,可选
如果
True
,则允许形状重叠。- num_trialsint,可选
在跳过形状之前尝试将其放入图像的次数。
- rng{
numpy.random.Generator
, int},可选 伪随机数生成器。默认情况下,使用 PCG64 生成器(请参阅
numpy.random.default_rng()
)。如果rng
是 int,则它用于为生成器设定种子。- channel_axisint 或 None,可选
如果为 None,则假设图像为灰度(单通道)图像。否则,此参数指示数组的哪个轴对应于通道。
在 0.19 版本中添加: 在 0.19 版本中添加了
channel_axis
。
- 返回:
- imageuint8 数组
具有拟合形状的图像。
- labels列表
标签列表,图像中每个形状一个标签。每个标签都是一个 (类别,((r0, r1), (c0, c1))) 元组,指定形状的类别和边界框坐标。
示例
>>> import skimage.draw >>> image, labels = skimage.draw.random_shapes((32, 32), max_shapes=3) >>> image array([ [[255, 255, 255], [255, 255, 255], [255, 255, 255], ..., [255, 255, 255], [255, 255, 255], [255, 255, 255]]], dtype=uint8) >>> labels [('circle', ((22, 18), (25, 21))), ('triangle', ((5, 6), (13, 13)))]
随机形状
- skimage.draw.rectangle(start, end=None, extent=None, shape=None)[源代码]#
生成矩形内像素的坐标。
- 参数:
- start元组
矩形的起始点,例如,
([平面,] 行, 列)
。- end元组
矩形的结束点
([平面,] 行, 列)
。对于 2D 矩阵,由矩形定义的切片为[start:(end+1)]
。必须指定end
或extent
中的一个。- extent元组
绘制矩形的范围(大小)。例如,
([平面数,] 行数, 列数)
。必须指定end
或extent
中的一个。负范围有效,将导致矩形沿相反方向绘制。如果范围为负,则不包括start
点。- shapetuple, 可选
图像形状,用于确定输出坐标的最大边界。这对于裁剪超出图像大小的矩形非常有用。默认情况下,不进行裁剪。
- 返回:
- coordsint 数组,形状 (Ndim, Npoints)
矩形中所有像素的坐标。
注释
此函数可以通过传递长度为 N 的元组
start
和end
或extent
来应用于 N 维图像。示例
>>> import numpy as np >>> from skimage.draw import rectangle >>> img = np.zeros((5, 5), dtype=np.uint8) >>> start = (1, 1) >>> extent = (3, 3) >>> rr, cc = rectangle(start, extent=extent, shape=img.shape) >>> img[rr, cc] = 1 >>> img array([[0, 0, 0, 0, 0], [0, 1, 1, 1, 0], [0, 1, 1, 1, 0], [0, 1, 1, 1, 0], [0, 0, 0, 0, 0]], dtype=uint8)
>>> img = np.zeros((5, 5), dtype=np.uint8) >>> start = (0, 1) >>> end = (3, 3) >>> rr, cc = rectangle(start, end=end, shape=img.shape) >>> img[rr, cc] = 1 >>> img array([[0, 1, 1, 1, 0], [0, 1, 1, 1, 0], [0, 1, 1, 1, 0], [0, 1, 1, 1, 0], [0, 0, 0, 0, 0]], dtype=uint8)
>>> import numpy as np >>> from skimage.draw import rectangle >>> img = np.zeros((6, 6), dtype=np.uint8) >>> start = (3, 3) >>> >>> rr, cc = rectangle(start, extent=(2, 2)) >>> img[rr, cc] = 1 >>> rr, cc = rectangle(start, extent=(-2, 2)) >>> img[rr, cc] = 2 >>> rr, cc = rectangle(start, extent=(-2, -2)) >>> img[rr, cc] = 3 >>> rr, cc = rectangle(start, extent=(2, -2)) >>> img[rr, cc] = 4 >>> print(img) [[0 0 0 0 0 0] [0 3 3 2 2 0] [0 3 3 2 2 0] [0 4 4 1 1 0] [0 4 4 1 1 0] [0 0 0 0 0 0]]
- skimage.draw.rectangle_perimeter(start, end=None, extent=None, shape=None, clip=False)[源代码]#
生成正好在矩形周围的像素坐标。
- 参数:
- start元组
内部矩形的起始点,例如,
(行, 列)
。- end元组
内部矩形的结束点
(行, 列)
。对于 2D 矩阵,由内部矩形定义的切片为[start:(end+1)]
。必须指定end
或extent
中的一个。- extent元组
内部矩形的范围(大小)。例如,
(行数, 列数)
。必须指定end
或extent
中的一个。允许负范围。请参阅rectangle
以更好地理解它们的行为方式。- shapetuple, 可选
图像形状,用于确定输出坐标的最大边界。这对于裁剪超出图像大小的周长非常有用。默认情况下,不进行裁剪。长度必须至少为 2。仅使用前两个值来确定输入图像的范围。
- clipbool,可选
是否将周长裁剪到提供的形状。如果设置为 True,则绘制的图形始终是一个闭合的多边形,所有边都可见。
- 返回:
- coordsint 数组,形状 (2, Npoints)
矩形中所有像素的坐标。
示例
>>> import numpy as np >>> from skimage.draw import rectangle_perimeter >>> img = np.zeros((5, 6), dtype=np.uint8) >>> start = (2, 3) >>> end = (3, 4) >>> rr, cc = rectangle_perimeter(start, end=end, shape=img.shape) >>> img[rr, cc] = 1 >>> img array([[0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 1, 1], [0, 0, 1, 0, 0, 1], [0, 0, 1, 0, 0, 1], [0, 0, 1, 1, 1, 1]], dtype=uint8)
>>> img = np.zeros((5, 5), dtype=np.uint8) >>> r, c = rectangle_perimeter(start, (10, 10), shape=img.shape, clip=True) >>> img[r, c] = 1 >>> img array([[0, 0, 0, 0, 0], [0, 0, 1, 1, 1], [0, 0, 1, 0, 1], [0, 0, 1, 0, 1], [0, 0, 1, 1, 1]], dtype=uint8)
- skimage.draw.set_color(image, coords, color, alpha=1)[源代码]#
在给定坐标处设置图像中的像素颜色。
请注意,此函数会就地修改图像的颜色。超出图像形状的坐标将被忽略。
- 参数:
- image(M, N, C) ndarray
图像
- coords((K,) ndarray, (K,) ndarray) 元组
要着色的像素的行和列坐标。
- color(C,) ndarray
要分配给图像中坐标的颜色。
- alpha标量或 (K,) ndarray
用于将颜色与图像混合的 Alpha 值。0 为透明,1 为不透明。
示例
>>> from skimage.draw import line, set_color >>> img = np.zeros((10, 10), dtype=np.uint8) >>> rr, cc = line(1, 1, 20, 20) >>> set_color(img, (rr, cc), 1) >>> img array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]], dtype=uint8)