skimage.draw#

繪圖基本元素,例如線條、圓形、文字等。

bezier_curve

產生貝茲曲線座標。

circle_perimeter

產生圓形周長座標。

circle_perimeter_aa

產生反鋸齒圓形周長座標。

disk

產生圓形內像素的座標。

ellipse

產生橢圓形內像素的座標。

ellipse_perimeter

產生橢圓形周長座標。

ellipsoid

為給定的半軸長度產生橢球體。

ellipsoid_stats

計算橢球體的解析體積和表面積。

line

產生線條像素座標。

line_aa

產生反鋸齒線條像素座標。

line_nd

在 n 維度中繪製單像素粗細的線條。

polygon

產生多邊形內像素的座標。

polygon2mask

從多邊形建立二元遮罩。

polygon_perimeter

產生多邊形周長座標。

random_shapes

產生帶有隨機形狀的影像,並以邊界框標記。

rectangle

產生矩形內像素的座標。

rectangle_perimeter

產生正好在矩形周圍的像素座標。

set_color

在給定座標處設定影像中的像素顏色。


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)

像素的索引 (rrcc) 和強度值 (val)。img[rr, cc] = val

注意事項

Wu 的方法繪製反鋸齒圓形。此實作未使用查詢表最佳化。

使用函式 draw.set_colorcircle_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_radiusdouble

短軸和長軸。(r/r_radius)**2 + (c/c_radius)**2 = 1

shapetuple, 可選

影像形狀,用於決定輸出像素座標的最大範圍。這對於超出影像大小的橢圓形非常有用。預設會使用橢圓形的完整範圍。長度必須至少為 2。只有前兩個值用於決定範圍。

rotationfloat, 可選 (預設 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

請注意,沒有指定 shapeellipse 位置也可能有負值,因為在平面上這是正確的。另一方面,之後將這些橢圓形位置用於影像可能會導致出現在影像的另一側,因為 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)[原始碼]#

產生橢圓形周長座標。

參數:
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)

請注意,沒有指定 shapeellipse 位置也可能有負值,因為在平面上這是正確的。另一方面,之後將這些橢圓形位置用於影像可能會導致出現在影像的另一側,因為 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)[原始碼]#

為給定的半軸長度產生橢球體。

各半軸長度沿著笛卡爾座標系的三個維度給出。每個維度可以使用不同的網格間距。

參數:
a浮點數

沿著 x 軸的半軸長度。

b浮點數

沿著 y 軸的半軸長度。

c浮點數

沿著 z 軸的半軸長度。

spacing浮點數的三元組

三個空間維度中的網格間距。

levelset布林值

如果為 True,則返回此橢球體的水平集(關於零的帶符號水平集,正數表示內部),類型為 np.float64。False 則返回該水平集的二元化版本。

傳回:
ellipsoid(M, N, P) 陣列

以給定 spacing 正確調整大小的陣列中居中的橢球體。布林值 dtype,除非 levelset=True,在這種情況下,將返回一個浮點陣列,其中水平集大於 0.0 表示橢球體。

行進立方體

行進立方體

skimage.draw.ellipsoid_stats(a, b, c)[原始碼]#

計算橢球體的解析體積和表面積。

橢球體的表面積由下式給出

\[S=4\pi b c R_G\!\left(1, \frac{a^2}{b^2}, \frac{a^2}{c^2}\right)\]

其中 \(R_G\) 是卡爾森第二類完全對稱橢圓積分 [1]。後者實現為 scipy.special.elliprg()

參數:
a浮點數

沿著 x 軸的半軸長度。

b浮點數

沿著 y 軸的半軸長度。

c浮點數

沿著 z 軸的半軸長度。

傳回:
vol浮點數

計算出的橢球體體積。

surf浮點數

計算出的橢球體表面積。

參考資料


skimage.draw.line(r0, c0, r1, c1)[原始碼]#

產生線條像素座標。

參數:
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)[原始碼]#

產生反鋸齒線條像素座標。

參數:
r0, c0int

起始位置(列,行)。

r1, c1int

結束位置(列,行)。

傳回:
rr, cc, val(N,) ndarray (int, int, float)

像素的索引 (rrcc) 和強度值 (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)[原始碼]#

在 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)[原始碼]#

產生多邊形內像素的座標。

參數:
r(N,) 類陣列

多邊形頂點的列座標。

c(N,) 類陣列

多邊形頂點的行座標。

shapetuple, 可選

用於確定輸出像素座標最大範圍的影像形狀。這對於超出影像大小的多邊形很有用。如果為 None,則使用多邊形的全部範圍。長度必須至少為 2。只有前兩個值用於確定輸入影像的範圍。

傳回:
rr, ccint 的 ndarray

多邊形的像素座標。可用於直接索引到陣列中,例如 img[rr, cc] = 1

另請參閱

polygon2mask

從多邊形建立二元遮罩。

注意事項

此函數確保 rrcc 不包含負值。座標小於 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’ 的 2 維 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_sizemax_size 限制的隨機大小。可能發生隨機產生的形狀根本不適合圖像的情況。在這種情況下,演算法將使用新的起始座標嘗試一定次數。但是,這也意味著某些形狀可能會被完全跳過。在這種情況下,此函式產生的形狀會少於要求。

參數:
image_shapetuple

要產生的圖像的列數和行數。

max_shapesint

(嘗試)放入形狀的最大形狀數量。

min_shapesint,可選

(嘗試)放入形狀的最小形狀數量。

min_sizeint,可選

要放入圖像的每個形狀的最小尺寸。

max_sizeint,可選

要放入圖像的每個形狀的最大尺寸。

num_channelsint,可選

產生圖像中的通道數。如果為 1,則產生單色圖像,否則產生具有多個通道的彩色圖像。如果 multichannel 設定為 False,則忽略此值。

shape{rectangle, circle, triangle, ellipse, None} str,可選

要產生的形狀名稱或 None 以選取隨機形狀。

intensity_range{uint8 的 tuple 或 uint8 的 tuple 的 tuple},可選

從中取樣像素值的數值範圍。對於灰階圖像,格式為 (最小值, 最大值)。對於多通道,如果通道的範圍相等則為 ((最小值, 最大值),),如果不同則為 ((最小值_0, 最大值_0), … (最小值_N, 最大值_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 版本中新增:channel_axis 已在 0.19 中新增。

傳回:
imageuint8 陣列

具有擬合形狀的圖像。

labelslist

標籤清單,圖像中每個形狀一個標籤。每個標籤都是一個 (類別, ((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)[原始碼]#

產生矩形內像素的座標。

參數:
starttuple

矩形的起點,例如 ([平面,] 列, 行)

endtuple

矩形的終點 ([平面,] 列, 行)。對於 2D 矩陣,矩形定義的切片為 [start:(end+1)]。必須指定 endextent

extenttuple

繪製矩形的範圍(大小)。例如 ([平面數,] 列數, 行數)。必須指定 endextent。負範圍是有效的,並且會產生沿相反方向的矩形。如果範圍為負數,則不包括 start 點。

shapetuple, 可選

用於決定輸出座標最大邊界的影像形狀。這對於裁切超出影像尺寸的矩形非常有用。預設情況下,不執行任何裁切。

傳回:
coords整數陣列,形狀 (N維度, N點)

矩形中所有像素的座標。

注意事項

透過將 startendextent 作為長度為 N 的元組傳遞,此函數可以應用於 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)[原始碼]#

產生正好在矩形周圍的像素座標。

參數:
starttuple

內部矩形的起始點,例如,(列, 行)

endtuple

內部矩形的結束點 (列, 行)。對於 2D 矩陣,由內部矩形定義的切片是 [start:(end+1)]。必須指定 endextent 其中之一。

extenttuple

內部矩形的範圍(大小)。例如, (列數, 行數)。必須指定 endextent 其中之一。允許負範圍。請參閱 rectangle 以更好地了解它們的行為。

shapetuple, 可選

用於決定輸出座標最大邊界的影像形狀。這對於裁切超出影像尺寸的邊界非常有用。預設情況下,不執行任何裁切。長度必須至少為 2。僅使用前兩個值來決定輸入影像的範圍。

clipbool,可選

是否將邊界裁切到提供的形狀。如果將此設定為 True,則繪製的圖形將始終是一個封閉的多邊形,且所有邊都可見。

傳回:
coords整數陣列,形狀 (2, N點)

矩形中所有像素的座標。

範例

>>> 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)