skimage.feature#

特徵偵測和提取,例如紋理分析、角點等。

blob_dog

在給定的灰階影像中尋找斑點。

blob_doh

在給定的灰階影像中尋找斑點。

blob_log

在給定的灰階影像中尋找斑點。

canny

使用 Canny 演算法對影像進行邊緣濾波。

corner_fast

提取給定影像的 FAST 角點。

corner_foerstner

計算 Foerstner 角點測量響應影像。

corner_harris

計算 Harris 角點測量響應影像。

corner_kitchen_rosenfeld

計算 Kitchen 和 Rosenfeld 角點測量響應影像。

corner_moravec

計算 Moravec 角點測量響應影像。

corner_orientations

計算角點的方向。

corner_peaks

在角點測量響應影像中尋找峰值。

corner_shi_tomasi

計算 Shi-Tomasi (Kanade-Tomasi) 角點測量響應影像。

corner_subpix

決定角點的次像素位置。

daisy

為給定影像密集提取 DAISY 特徵描述符。

draw_haar_like_feature

Haar 類特徵的可視化。

draw_multiblock_lbp

多區塊局部二元模式可視化。

fisher_vector

計算給定一些描述符/向量和相關的估計 GMM 的費雪向量。

graycomatrix

計算灰階共生矩陣。

graycoprops

計算 GLCM 的紋理屬性。

haar_like_feature

計算積分影像的感興趣區域 (ROI) 的 Haar 類特徵。

haar_like_feature_coord

計算 Haar 類特徵的座標。

hessian_matrix

計算 Hessian 矩陣。

hessian_matrix_det

計算影像上的近似 Hessian 行列式。

hessian_matrix_eigvals

計算 Hessian 矩陣的特徵值。

hog

提取給定影像的方向梯度直方圖 (HOG)。

learn_gmm

給定一組描述符和模式數量(即高斯分佈),估計高斯混合模型 (GMM)。

local_binary_pattern

計算影像的局部二元模式 (LBP)。

match_descriptors

描述符的暴力匹配。

match_template

使用正規化相關性將範本與 2D 或 3D 影像進行比對。

multiblock_lbp

多區塊局部二元模式 (MB-LBP)。

multiscale_basic_features

單通道或多通道 nd 影像的局部特徵。

peak_local_max

在影像中尋找峰值作為座標清單。

plot_matched_features

繪製兩個影像之間比對的特徵。

shape_index

計算形狀索引。

structure_tensor

使用平方差之和計算結構張量。

structure_tensor_eigenvalues

計算結構張量的特徵值。

BRIEF

BRIEF 二元描述符提取器。

CENSURE

CENSURE 關鍵點偵測器。

Cascade

用於物件偵測的分類器串聯類別。

ORB

定向 FAST 和旋轉 BRIEF 特徵偵測器和二元描述符提取器。

SIFT

SIFT 特徵偵測和描述符提取。


skimage.feature.blob_dog(image, min_sigma=1, max_sigma=50, sigma_ratio=1.6, threshold=0.5, overlap=0.5, *, threshold_rel=None, exclude_border=False)[原始碼]#

在給定的灰階影像中尋找斑點。

使用高斯差分 (DoG) 方法 [1], [2] 尋找斑點。對於找到的每個斑點,此方法會傳回其座標和偵測到斑點的高斯核心的標準差。

參數:
imagendarray

輸入灰階影像,斑點假設為在深色背景上的淺色(黑色上的白色)。

min_sigma純量或純量序列,可選

高斯核心的最小標準差。保持此值較低以偵測較小的斑點。高斯濾波器的標準差會針對每個軸以序列或單一數字給定,在單一數字的情況下,它對於所有軸都相等。

max_sigma純量或純量序列,可選

高斯核心的最大標準差。保持此值較高以偵測較大的斑點。高斯濾波器的標準差會針對每個軸以序列或單一數字給定,在單一數字的情況下,它對於所有軸都相等。

sigma_ratio浮點數,可選

用於計算高斯差分的的高斯核心的標準差之間的比例

threshold浮點數或 None,可選

尺度空間最大值的絕對下限。小於 threshold 的局部最大值會被忽略。減少此值以偵測強度較低的斑點。如果也指定了 threshold_rel,則會使用較大的臨界值。如果為 None,則改用 threshold_rel

overlap浮點數,可選

介於 0 和 1 之間的值。如果兩個斑點的面積重疊超過 threshold 的比例,則會消除較小的斑點。

threshold_rel浮點數或 None,可選

峰值的最小強度,計算方式為 max(dog_space) * threshold_rel,其中 dog_space 指的是內部計算的高斯差分 (DoG) 影像堆疊。此值應介於 0 和 1 之間。如果為 None,則改用 threshold

exclude_border整數元組、整數或 False,可選

如果為整數元組,則元組的長度必須符合輸入陣列的維度。元組的每個元素都會排除沿該維度的影像邊界 exclude_border 像素內的峰值。如果為非零整數,則 exclude_border 會排除來自影像邊界 exclude_border 像素內的峰值。如果為零或 False,則會識別峰值,而不管它們與邊界的距離。

傳回值:
A(n, image.ndim + sigma) ndarray

一個 2d 陣列,其中每列代表 2D 影像的 2 個座標值,或 3D 影像的 3 個座標值,加上所使用的 sigma(s)。當傳遞單一 sigma 時,輸出為:(r, c, sigma)(p, r, c, sigma),其中 (r, c)(p, r, c) 是斑點的座標,而 sigma 是偵測到斑點的高斯核心的標準差。當使用異向高斯分佈時(每個維度的 sigma),會傳回每個維度偵測到的 sigma。

註解

對於 2D 影像,每個斑點的半徑大約為 \(\sqrt{2}\sigma\),對於 3D 影像,則為 \(\sqrt{3}\sigma\)

參考文獻

[2]

Lowe, D. G. “Distinctive Image Features from Scale-Invariant Keypoints.” International Journal of Computer Vision 60, 91–110 (2004). https://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf DOI:10.1023/B:VISI.0000029664.99615.94

範例

>>> from skimage import data, feature
>>> coins = data.coins()
>>> feature.blob_dog(coins, threshold=.05, min_sigma=10, max_sigma=40)
array([[128., 155.,  10.],
       [198., 155.,  10.],
       [124., 338.,  10.],
       [127., 102.,  10.],
       [193., 281.,  10.],
       [126., 208.,  10.],
       [267., 115.,  10.],
       [197., 102.,  10.],
       [198., 215.,  10.],
       [123., 279.,  10.],
       [126.,  46.,  10.],
       [259., 247.,  10.],
       [196.,  43.,  10.],
       [ 54., 276.,  10.],
       [267., 358.,  10.],
       [ 58., 100.,  10.],
       [259., 305.,  10.],
       [185., 347.,  16.],
       [261., 174.,  16.],
       [ 46., 336.,  16.],
       [ 54., 217.,  10.],
       [ 55., 157.,  10.],
       [ 57.,  41.,  10.],
       [260.,  47.,  16.]])

斑點偵測

斑點偵測

skimage.feature.blob_doh(image, min_sigma=1, max_sigma=30, num_sigma=10, threshold=0.01, overlap=0.5, log_scale=False, *, threshold_rel=None)[原始碼]#

在給定的灰階影像中尋找斑點。

使用黑塞矩陣行列式 (Determinant of Hessian) 方法 [1] 來尋找斑點。對於找到的每個斑點,此方法會回傳其座標以及用於計算黑塞矩陣(其行列式檢測到斑點)的高斯核心的標準差。黑塞矩陣行列式使用 [2] 來近似。

參數:
image2D ndarray

輸入灰階影像。斑點可以是亮對暗,反之亦然。

min_sigmafloat,可選

用於計算黑塞矩陣的高斯核心的最小標準差。保持此值較低可檢測較小的斑點。

max_sigmafloat,可選

用於計算黑塞矩陣的高斯核心的最大標準差。保持此值較高可檢測較大的斑點。

num_sigmaint,可選

min_sigmamax_sigma 之間要考慮的標準差中間值數量。

threshold浮點數或 None,可選

尺度空間最大值的絕對下限。小於 threshold 的局部最大值會被忽略。減少此值以偵測強度較低的斑點。如果也指定了 threshold_rel,則會使用較大的臨界值。如果為 None,則改用 threshold_rel

overlap浮點數,可選

介於 0 和 1 之間的值。如果兩個斑點的面積重疊超過 threshold 的比例,則會消除較小的斑點。

log_scalebool,可選

如果設定,標準差的中間值將使用以 10 為底的對數尺度進行內插。否則,將使用線性內插。

threshold_rel浮點數或 None,可選

峰值的最小強度,計算方式為 max(doh_space) * threshold_rel,其中 doh_space 是指內部計算的黑塞矩陣行列式 (DoH) 影像堆疊。此值應介於 0 和 1 之間。如果為 None,則改用 threshold

傳回值:
A(n, 3) ndarray

一個 2 維陣列,每列代表 3 個值,(y,x,sigma),其中 (y,x) 是斑點的座標,而 sigma 是黑塞矩陣(其行列式檢測到斑點)的高斯核心的標準差。

註解

每個斑點的半徑約為 sigma。黑塞矩陣行列式的計算與標準差無關。因此,檢測較大的斑點不會花費更多時間。在方法行 blob_dog()blob_log() 中,計算較大 sigma 的高斯函數會花費更多時間。缺點是此方法由於在黑塞矩陣行列式近似中使用了盒狀濾波器,因此無法用於檢測半徑小於 3px 的斑點。

參考文獻

[2]

Herbert Bay, Andreas Ess, Tinne Tuytelaars, Luc Van Gool, “SURF: Speeded Up Robust Features” ftp://ftp.vision.ee.ethz.ch/publications/articles/eth_biwi_00517.pdf

範例

>>> from skimage import data, feature
>>> img = data.coins()
>>> feature.blob_doh(img)
array([[197.        , 153.        ,  20.33333333],
       [124.        , 336.        ,  20.33333333],
       [126.        , 153.        ,  20.33333333],
       [195.        , 100.        ,  23.55555556],
       [192.        , 212.        ,  23.55555556],
       [121.        , 271.        ,  30.        ],
       [126.        , 101.        ,  20.33333333],
       [193.        , 275.        ,  23.55555556],
       [123.        , 205.        ,  20.33333333],
       [270.        , 363.        ,  30.        ],
       [265.        , 113.        ,  23.55555556],
       [262.        , 243.        ,  23.55555556],
       [185.        , 348.        ,  30.        ],
       [156.        , 302.        ,  30.        ],
       [123.        ,  44.        ,  23.55555556],
       [260.        , 173.        ,  30.        ],
       [197.        ,  44.        ,  20.33333333]])

斑點偵測

斑點偵測

skimage.feature.blob_log(image, min_sigma=1, max_sigma=50, num_sigma=10, threshold=0.2, overlap=0.5, log_scale=False, *, threshold_rel=None, exclude_border=False)[原始碼]#

在給定的灰階影像中尋找斑點。

使用高斯拉普拉斯 (LoG) 方法 [1] 來尋找斑點。對於找到的每個斑點,此方法會回傳其座標以及檢測到斑點的高斯核心的標準差。

參數:
imagendarray

輸入灰階影像,斑點假設為在深色背景上的淺色(黑色上的白色)。

min_sigma純量或純量序列,可選

用於高斯核心的最小標準差。保持此值較低可檢測較小的斑點。高斯濾波器的標準差以序列或單一數字的形式給出,如果是單一數字,則表示所有軸都相等。

max_sigma純量或純量序列,可選

高斯核心的最大標準差。保持此值較高以偵測較大的斑點。高斯濾波器的標準差會針對每個軸以序列或單一數字給定,在單一數字的情況下,它對於所有軸都相等。

num_sigmaint,可選

min_sigmamax_sigma 之間要考慮的標準差中間值數量。

threshold浮點數或 None,可選

尺度空間最大值的絕對下限。小於 threshold 的局部最大值會被忽略。減少此值以偵測強度較低的斑點。如果也指定了 threshold_rel,則會使用較大的臨界值。如果為 None,則改用 threshold_rel

overlap浮點數,可選

介於 0 和 1 之間的值。如果兩個斑點的面積重疊超過 threshold 的比例,則會消除較小的斑點。

log_scalebool,可選

如果設定,標準差的中間值將使用以 10 為底的對數尺度進行內插。否則,將使用線性內插。

threshold_rel浮點數或 None,可選

峰值的最小強度,計算方式為 max(log_space) * threshold_rel,其中 log_space 是指內部計算的高斯拉普拉斯 (LoG) 影像堆疊。此值應介於 0 和 1 之間。如果為 None,則改用 threshold

exclude_border整數元組、整數或 False,可選

如果為整數元組,則元組的長度必須符合輸入陣列的維度。元組的每個元素都會排除沿該維度的影像邊界 exclude_border 像素內的峰值。如果為非零整數,則 exclude_border 會排除來自影像邊界 exclude_border 像素內的峰值。如果為零或 False,則會識別峰值,而不管它們與邊界的距離。

傳回值:
A(n, image.ndim + sigma) ndarray

一個 2d 陣列,其中每列代表 2D 影像的 2 個座標值,或 3D 影像的 3 個座標值,加上所使用的 sigma(s)。當傳遞單一 sigma 時,輸出為:(r, c, sigma)(p, r, c, sigma),其中 (r, c)(p, r, c) 是斑點的座標,而 sigma 是偵測到斑點的高斯核心的標準差。當使用異向高斯分佈時(每個維度的 sigma),會傳回每個維度偵測到的 sigma。

註解

對於 2D 影像,每個斑點的半徑大約為 \(\sqrt{2}\sigma\),對於 3D 影像,則為 \(\sqrt{3}\sigma\)

參考文獻

範例

>>> from skimage import data, feature, exposure
>>> img = data.coins()
>>> img = exposure.equalize_hist(img)  # improves detection
>>> feature.blob_log(img, threshold = .3)
array([[124.        , 336.        ,  11.88888889],
       [198.        , 155.        ,  11.88888889],
       [194.        , 213.        ,  17.33333333],
       [121.        , 272.        ,  17.33333333],
       [263.        , 244.        ,  17.33333333],
       [194.        , 276.        ,  17.33333333],
       [266.        , 115.        ,  11.88888889],
       [128.        , 154.        ,  11.88888889],
       [260.        , 174.        ,  17.33333333],
       [198.        , 103.        ,  11.88888889],
       [126.        , 208.        ,  11.88888889],
       [127.        , 102.        ,  11.88888889],
       [263.        , 302.        ,  17.33333333],
       [197.        ,  44.        ,  11.88888889],
       [185.        , 344.        ,  17.33333333],
       [126.        ,  46.        ,  11.88888889],
       [113.        , 323.        ,   1.        ]])

斑點偵測

斑點偵測

skimage.feature.canny(image, sigma=1.0, low_threshold=None, high_threshold=None, mask=None, use_quantiles=False, *, mode='constant', cval=0.0)[原始碼]#

使用 Canny 演算法對影像進行邊緣濾波。

參數:
image2D 陣列

要偵測邊緣的灰階輸入影像;可以是任何 dtype。

sigmafloat,可選

高斯濾波器的標準差。

low_thresholdfloat,可選

用於滯後閾值處理(連結邊緣)的下限。如果為 None,則 low_threshold 會設定為 dtype 最大值的 10%。

high_thresholdfloat,可選

用於滯後閾值處理(連結邊緣)的上限。如果為 None,則 high_threshold 會設定為 dtype 最大值的 20%。

mask陣列,dtype=bool,可選

用於限制 Canny 應用於特定區域的遮罩。

use_quantilesbool,可選

如果為 True,則將 low_threshold 和 high_threshold 視為邊緣強度影像的分位數,而不是絕對邊緣強度值。如果為 True,則閾值必須在 [0, 1] 範圍內。

modestr,{'reflect'、'constant'、'nearest'、'mirror'、'wrap'}

mode 參數決定在高斯濾波期間如何處理陣列邊界,其中 cval 是當 mode 等於 'constant' 時的值。

cvalfloat,可選

如果 mode 為 'constant',則填入輸入邊緣以外的值。

傳回值:
output2D 陣列 (影像)

二元邊緣圖。

另請參閱

skimage.filters.sobel

註解

演算法的步驟如下

  • 使用寬度為 sigma 的高斯函數平滑影像。

  • 應用水平和垂直 Sobel 運算子以取得影像內的梯度。邊緣強度是梯度的範數。

  • 將潛在邊緣細化為 1 像素寬的曲線。首先,找出每個點的邊緣法線。這是透過查看 X-Sobel 和 Y-Sobel 的符號和相對大小,將點分成 4 個類別來完成的:水平、垂直、對角和反對角。然後在法線和反方向查看這些方向的值是否大於該點。使用內插來取得混合點,而不是選取最接近法線的點。

  • 執行滯後閾值處理:首先將所有高於高閾值的點標示為邊緣。然後遞迴地將任何高於低閾值且與標示點 8 連接的點標示為邊緣。

參考文獻

[1]

Canny, J., A Computational Approach To Edge Detection, IEEE Trans. Pattern Analysis and Machine Intelligence, 8:679-714, 1986 DOI:10.1109/TPAMI.1986.4767851

[2]

William Green 的 Canny 教學 https://en.wikipedia.org/wiki/Canny_edge_detector

範例

>>> from skimage import feature
>>> rng = np.random.default_rng()
>>> # Generate noisy image of a square
>>> im = np.zeros((256, 256))
>>> im[64:-64, 64:-64] = 1
>>> im += 0.2 * rng.random(im.shape)
>>> # First trial with the Canny filter, with the default smoothing
>>> edges1 = feature.canny(im)
>>> # Increase the smoothing for better results
>>> edges2 = feature.canny(im, sigma=3)

Canny 邊緣偵測器

Canny 邊緣偵測器

直線霍夫轉換

直線霍夫轉換

圓形和橢圓形霍夫轉換

圓形和橢圓形霍夫轉換

評估分割指標

評估分割指標

比較基於邊緣和基於區域的分割

比較基於邊緣和基於區域的分割

skimage.feature.corner_fast(image, n=12, threshold=0.15)[原始碼]#

提取給定影像的 FAST 角點。

參數:
image(M, N) ndarray

輸入影像。

nint, 選填

在圓圈上 16 個像素中,至少連續幾個像素相對於測試像素應該更亮或更暗。如果 Ic < Ip - threshold,則圓圈上的點 c 相對於測試像素 p 更暗;如果 Ic > Ip + threshold,則更亮。也代表 FAST-n 角點偵測器中的 n。

thresholdfloat, 選填

用於判斷圓圈上的像素相對於測試像素是更亮、更暗還是相似的臨界值。當需要更多角點時,減少臨界值,反之亦然。

傳回值:
responsendarray

FAST 角點響應影像。

參考文獻

[1]

Rosten, E., & Drummond, T. (2006, May). Machine learning for high-speed corner detection. In European conference on computer vision (pp. 430-443). Springer, Berlin, Heidelberg. DOI:10.1007/11744023_34 http://www.edwardrosten.com/work/rosten_2006_machine.pdf

[2]

Wikipedia, “Features from accelerated segment test”, https://en.wikipedia.org/wiki/Features_from_accelerated_segment_test

範例

>>> from skimage.feature import corner_fast, corner_peaks
>>> square = np.zeros((12, 12))
>>> square[3:9, 3:9] = 1
>>> square.astype(int)
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, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 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, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
>>> corner_peaks(corner_fast(square, 9), min_distance=1)
array([[3, 3],
       [3, 8],
       [8, 3],
       [8, 8]])

skimage.feature.corner_foerstner(image, sigma=1)[原始碼]#

計算 Foerstner 角點測量響應影像。

此角點偵測器使用來自自相關矩陣 A 的資訊

A = [(imx**2)   (imx*imy)] = [Axx Axy]
    [(imx*imy)   (imy**2)]   [Axy Ayy]

其中 imx 和 imy 是使用高斯濾波器平均的一階導數。然後將角點量度定義為

w = det(A) / trace(A)           (size of error ellipse)
q = 4 * det(A) / trace(A)**2    (roundness of error ellipse)
參數:
image(M, N) ndarray

輸入影像。

sigmafloat,可選

用於高斯核的標準差,它用作自相關矩陣的加權函數。

傳回值:
wndarray

誤差橢圓大小。

qndarray

誤差橢圓的圓度。

參考文獻

[1]

Förstner, W., & Gülch, E. (1987, June). A fast operator for detection and precise location of distinct points, corners and centres of circular features. In Proc. ISPRS intercommission conference on fast processing of photogrammetric data (pp. 281-305). https://cseweb.ucsd.edu/classes/sp02/cse252/foerstner/foerstner.pdf

範例

>>> from skimage.feature import corner_foerstner, corner_peaks
>>> square = np.zeros([10, 10])
>>> square[2:8, 2:8] = 1
>>> square.astype(int)
array([[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, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 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]])
>>> w, q = corner_foerstner(square)
>>> accuracy_thresh = 0.5
>>> roundness_thresh = 0.3
>>> foerstner = (q > roundness_thresh) * (w > accuracy_thresh) * w
>>> corner_peaks(foerstner, min_distance=1)
array([[2, 2],
       [2, 7],
       [7, 2],
       [7, 7]])

skimage.feature.corner_harris(image, method='k', k=0.05, eps=1e-06, sigma=1)[原始碼]#

計算 Harris 角點測量響應影像。

此角點偵測器使用來自自相關矩陣 A 的資訊

A = [(imx**2)   (imx*imy)] = [Axx Axy]
    [(imx*imy)   (imy**2)]   [Axy Ayy]

其中 imx 和 imy 是使用高斯濾波器平均的一階導數。然後將角點量度定義為

det(A) - k * trace(A)**2

2 * det(A) / (trace(A) + eps)
參數:
image(M, N) ndarray

輸入影像。

method{‘k’, ‘eps’}, 選填

從自相關矩陣計算響應影像的方法。

kfloat, 選填

用於區分角點和邊緣的靈敏度因子,通常在 [0, 0.2] 範圍內。k 值越小,偵測到的銳角越明顯。

epsfloat, 選填

正規化因子(Noble 的角點量度)。

sigmafloat,可選

用於高斯核的標準差,它用作自相關矩陣的加權函數。

傳回值:
responsendarray

哈里斯響應影像。

參考文獻

範例

>>> from skimage.feature import corner_harris, corner_peaks
>>> square = np.zeros([10, 10])
>>> square[2:8, 2:8] = 1
>>> square.astype(int)
array([[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, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 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]])
>>> corner_peaks(corner_harris(square), min_distance=1)
array([[2, 2],
       [2, 7],
       [7, 2],
       [7, 7]])

使用 RANSAC 的穩健匹配

使用 RANSAC 的穩健匹配

使用簡單影像拼接組裝影像

使用簡單影像拼接組裝影像

角點偵測

角點偵測

BRIEF 二元描述子

BRIEF 二元描述子

skimage.feature.corner_kitchen_rosenfeld(image, mode='constant', cval=0)[原始碼]#

計算 Kitchen 和 Rosenfeld 角點測量響應影像。

角點量度計算如下

(imxx * imy**2 + imyy * imx**2 - 2 * imxy * imx * imy)
    / (imx**2 + imy**2)

其中 imx 和 imy 是一階導數,而 imxx、imxy、imyy 是二階導數。

參數:
image(M, N) ndarray

輸入影像。

mode{‘constant’, ‘reflect’, ‘wrap’, ‘nearest’, ‘mirror’}, 選填

如何處理影像邊界之外的值。

cvalfloat,可選

與模式 'constant' 結合使用時,影像邊界之外的值。

傳回值:
responsendarray

Kitchen 和 Rosenfeld 響應影像。

參考文獻

[1]

Kitchen, L., & Rosenfeld, A. (1982). Gray-level corner detection. Pattern recognition letters, 1(2), 95-102. DOI:10.1016/0167-8655(82)90020-4


skimage.feature.corner_moravec(image, window_size=1)[原始碼]#

計算 Moravec 角點測量響應影像。

這是最簡單的角點偵測器之一,速度相對較快,但有一些限制(例如,不具旋轉不變性)。

參數:
image(M, N) ndarray

輸入影像。

window_sizeint, 選填

視窗大小。

傳回值:
responsendarray

Moravec 響應影像。

參考文獻

範例

>>> from skimage.feature import corner_moravec
>>> square = np.zeros([7, 7])
>>> square[3, 3] = 1
>>> square.astype(int)
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, 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]])
>>> corner_moravec(square).astype(int)
array([[0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 1, 0, 0],
       [0, 0, 1, 2, 1, 0, 0],
       [0, 0, 1, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0]])

skimage.feature.corner_orientations(image, corners, mask)[原始碼]#

計算角點的方向。

角點的方向是使用一階中心矩,即質心方法計算的。角點方向是從角點座標到使用一階中心矩計算的角點周圍局部鄰域中的強度質心的向量角度。

參數:
image(M, N) array

輸入灰階影像。

corners(K, 2) array

角點座標為 (row, col)

mask2D array

遮罩定義用於計算中心矩的角點的局部鄰域。

傳回值:
orientations(K, 1) array

角點的方向,範圍為 [-pi, pi]。

參考文獻

[1]

Ethan Rublee, Vincent Rabaud, Kurt Konolige and Gary Bradski “ORB : An efficient alternative to SIFT and SURF” http://www.vision.cs.chubu.ac.jp/CV-R/pdf/Rublee_iccv2011.pdf

[2]

Paul L. Rosin, “Measuring Corner Properties” http://users.cs.cf.ac.uk/Paul.Rosin/corner2.pdf

範例

>>> from skimage.morphology import octagon
>>> from skimage.feature import (corner_fast, corner_peaks,
...                              corner_orientations)
>>> square = np.zeros((12, 12))
>>> square[3:9, 3:9] = 1
>>> square.astype(int)
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, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 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, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
>>> corners = corner_peaks(corner_fast(square, 9), min_distance=1)
>>> corners
array([[3, 3],
       [3, 8],
       [8, 3],
       [8, 8]])
>>> orientations = corner_orientations(square, corners, octagon(3, 2))
>>> np.rad2deg(orientations)
array([  45.,  135.,  -45., -135.])

skimage.feature.corner_peaks(image, min_distance=1, threshold_abs=None, threshold_rel=None, exclude_border=True, indices=True, num_peaks=inf, footprint=None, labels=None, *, num_peaks_per_label=inf, p_norm=inf)[原始碼]#

在角點測量響應影像中尋找峰值。

這與 skimage.feature.peak_local_max 的不同之處在於,它抑制具有相同累加器值的多個連接峰值。

參數:
image(M, N) ndarray

輸入影像。

min_distanceint, 選填

峰值之間允許的最小距離。

**

請參閱 skimage.feature.peak_local_max()

p_normfloat

要使用的 Minkowski p 範數。應在 [1, inf] 範圍內。如果可能發生溢位,有限大的 p 可能會導致 ValueError。inf 對應於切比雪夫距離,而 2 對應於歐幾里得距離。

傳回值:
outputndarray 或布林值的 ndarray
  • 如果 indices = True :峰值的(行,列,…)座標。

  • 如果 indices = False :形狀像 image 的布林陣列,峰值由 True 值表示。

註解

在 0.18 版本變更:threshold_rel 的預設值已變更為 None,這表示讓 skimage.feature.peak_local_max 決定預設值。這等同於 threshold_rel=0

num_peaks 的限制會在抑制相連峰值之前套用。若要在抑制後限制峰值數量,請設定 num_peaks=np.inf 並後處理此函式的輸出。

範例

>>> from skimage.feature import peak_local_max
>>> response = np.zeros((5, 5))
>>> response[2:4, 2:4] = 1
>>> response
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 1., 1., 0.],
       [0., 0., 1., 1., 0.],
       [0., 0., 0., 0., 0.]])
>>> peak_local_max(response)
array([[2, 2],
       [2, 3],
       [3, 2],
       [3, 3]])
>>> corner_peaks(response)
array([[2, 2]])

使用 RANSAC 的穩健匹配

使用 RANSAC 的穩健匹配

使用簡單影像拼接組裝影像

使用簡單影像拼接組裝影像

角點偵測

角點偵測

BRIEF 二元描述子

BRIEF 二元描述子

skimage.feature.corner_shi_tomasi(image, sigma=1)[原始碼]#

計算 Shi-Tomasi (Kanade-Tomasi) 角點測量響應影像。

此角點偵測器使用來自自相關矩陣 A 的資訊

A = [(imx**2)   (imx*imy)] = [Axx Axy]
    [(imx*imy)   (imy**2)]   [Axy Ayy]

其中 imx 和 imy 是使用高斯濾波器平均的一階導數。然後,角落測量值定義為 A 的較小特徵值。

((Axx + Ayy) - sqrt((Axx - Ayy)**2 + 4 * Axy**2)) / 2
參數:
image(M, N) ndarray

輸入影像。

sigmafloat,可選

用於高斯核的標準差,它用作自相關矩陣的加權函數。

傳回值:
responsendarray

Shi-Tomasi 反應影像。

參考文獻

範例

>>> from skimage.feature import corner_shi_tomasi, corner_peaks
>>> square = np.zeros([10, 10])
>>> square[2:8, 2:8] = 1
>>> square.astype(int)
array([[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, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 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]])
>>> corner_peaks(corner_shi_tomasi(square), min_distance=1)
array([[2, 2],
       [2, 7],
       [7, 2],
       [7, 7]])

skimage.feature.corner_subpix(image, corners, window_size=11, alpha=0.99)[原始碼]#

決定角點的次像素位置。

統計檢定會判斷角落是定義為兩條邊的交點還是單個峰值。根據分類結果,子像素角落位置是根據灰度值的局部共變異數確定的。如果任一統計檢定的顯著性水準不足,則無法對角落進行分類,並且輸出子像素位置會設定為 NaN。

參數:
image(M, N) ndarray

輸入影像。

corners(K, 2) ndarray

角落座標 (row, col)

window_sizeint, 選填

子像素估計的搜尋視窗大小。

alphafloat,選用

角落分類的顯著性水準。

傳回值:
positions(K, 2) ndarray

子像素角落位置。對於「未分類」的角落,則為 NaN。

參考文獻

[1]

Förstner, W., & Gülch, E. (1987, June). A fast operator for detection and precise location of distinct points, corners and centres of circular features. In Proc. ISPRS intercommission conference on fast processing of photogrammetric data (pp. 281-305). https://cseweb.ucsd.edu/classes/sp02/cse252/foerstner/foerstner.pdf

範例

>>> from skimage.feature import corner_harris, corner_peaks, corner_subpix
>>> img = np.zeros((10, 10))
>>> img[:5, :5] = 1
>>> img[5:, 5:] = 1
>>> img.astype(int)
array([[1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
       [0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
       [0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
       [0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
       [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]])
>>> coords = corner_peaks(corner_harris(img), min_distance=2)
>>> coords_subpix = corner_subpix(img, coords, window_size=7)
>>> coords_subpix
array([[4.5, 4.5]])

使用 RANSAC 的穩健匹配

使用 RANSAC 的穩健匹配

角點偵測

角點偵測

skimage.feature.daisy(image, step=4, radius=15, rings=3, histograms=8, orientations=8, normalization='l1', sigmas=None, ring_radii=None, visualize=False)[原始碼]#

為給定影像密集提取 DAISY 特徵描述符。

DAISY 是一種與 SIFT 相似的特徵描述子,其公式允許快速密集提取。通常,這對於詞袋影像表示法非常實用。

此實作遵循 Tola 等人 [1],但在以下幾點有所不同

  • 直方圖箱貢獻透過音調範圍(角度範圍)上的圓形高斯視窗平滑處理。

  • 此程式碼中空間高斯平滑的 sigma 值與 Tola 等人 [2] 的原始程式碼中的 sigma 值不符。在他們的程式碼中,空間平滑會套用到輸入影像和中心直方圖。但是,此平滑在 [1] 中沒有記載,因此省略。

參數:
image(M, N) array

輸入影像(灰階)。

stepint,選用

描述子採樣點之間的距離。

radiusint,選用

最外環的半徑(以像素為單位)。

ringsint,選用

環數。

histogramsint,選用

每個環取樣的直方圖數。

orientationsint,選用

每個直方圖的方向(箱)數。

normalization[ ‘l1’ | ‘l2’ | ‘daisy’ | ‘off’ ],選用

如何正規化描述子

  • 「l1」:每個描述子的 L1 正規化。

  • 「l2」:每個描述子的 L2 正規化。

  • 「daisy」:個別直方圖的 L2 正規化。

  • 「off」:停用正規化。

sigmasfloat 的 1D 陣列,選用

中心直方圖和每個直方圖環的空間高斯平滑標準差。sigma 陣列應從中心向外排序。也就是說,第一個 sigma 值定義中心直方圖的空間平滑,而最後一個 sigma 值定義最外環的空間平滑。指定 sigma 會覆寫以下參數。

rings = len(sigmas) - 1

ring_radiiint 的 1D 陣列,選用

每個環的半徑(以像素為單位)。指定 ring_radii 會覆寫以下兩個參數。

rings = len(ring_radii) radius = ring_radii[-1]

如果同時給定 sigma 和 ring_radii,則它們必須滿足以下謂詞,因為中心直方圖不需要半徑。

len(ring_radii) == len(sigmas) + 1

visualizebool,選用

產生 DAISY 描述子的視覺化。

傳回值:
descs陣列

給定影像的 DAISY 描述子網格,其為陣列維度 (P, Q, R),其中

P = ceil((M - radius*2) / step) Q = ceil((N - radius*2) / step) R = (rings * histograms + 1) * orientations

descs_img(M, N, 3) 陣列(僅當 visualize==True 時)

DAISY 描述子的視覺化。

參考文獻

[1] (1,2)

Tola 等人。「Daisy:一種應用於寬基準立體視覺的有效密集描述子。」模式分析和機器智慧,IEEE Transactions on 32.5 (2010): 815-830。

密集 DAISY 特徵描述

密集 DAISY 特徵描述

skimage.feature.draw_haar_like_feature(image, r, c, width, height, feature_coord, color_positive_block=(1.0, 0.0, 0.0), color_negative_block=(0.0, 1.0, 0.0), alpha=0.5, max_n_features=None, rng=None)[原始碼]#

Haar 類特徵的可視化。

參數:
image(M, N) ndarray

需要計算特徵的積分影像區域。

rint

偵測視窗左上角的列座標。

cint

偵測視窗左上角的行座標。

widthint

偵測視窗的寬度。

heightint

偵測視窗的高度。

feature_coord元組的陣列清單或 None,選用

要提取的座標陣列。當您只想重新計算特徵的子集時,這非常有用。在這種情況下,feature_type 需要是包含每個特徵類型的陣列,如 haar_like_feature_coord() 所傳回。預設情況下,會計算所有座標。

color_positive_block3 個浮點數的元組

指定正向區塊顏色的浮點數。對應的值定義 (R, G, B) 值。預設值為紅色 (1, 0, 0)。

color_negative_block3 個浮點數的元組

指定負向區塊顏色的浮點數。對應的值定義 (R, G, B) 值。預設值為藍色 (0, 1, 0)。

alpha浮點數

範圍在 [0, 1] 的值,指定視覺化的不透明度。1 - 完全透明,0 - 不透明。

max_n_features整數,預設值=None

要傳回的最大特徵數。預設情況下,會傳回所有特徵。

rng{numpy.random.Generator, 整數},選用

虛擬亂數產生器。預設情況下,會使用 PCG64 產生器(請參閱 numpy.random.default_rng())。如果 rng 是整數,則會用來設定產生器的種子。

當產生的特徵集小於可用特徵總數時,會使用 rng。

傳回值:
features(M, N), ndarray

將在其中加入不同特徵的影像。

範例

>>> import numpy as np
>>> from skimage.feature import haar_like_feature_coord
>>> from skimage.feature import draw_haar_like_feature
>>> feature_coord, _ = haar_like_feature_coord(2, 2, 'type-4')
>>> image = draw_haar_like_feature(np.zeros((2, 2)),
...                                0, 0, 2, 2,
...                                feature_coord,
...                                max_n_features=1)
>>> image
array([[[0. , 0.5, 0. ],
        [0.5, 0. , 0. ]],

       [[0.5, 0. , 0. ],
        [0. , 0.5, 0. ]]])

Haar 類特徵描述符

Haar 類特徵描述符

使用 Haar 類特徵描述符進行人臉分類

使用 Haar 類特徵描述符進行人臉分類

skimage.feature.draw_multiblock_lbp(image, r, c, width, height, lbp_code=0, color_greater_block=(1, 1, 1), color_less_block=(0, 0.69, 0.96), alpha=0.5)[原始碼]#

多區塊局部二元模式可視化。

總和較高的區塊會使用 alpha 混合的白色矩形著色,而總和較低的區塊則會使用 alpha 混合的青色著色。可以變更顏色和 alpha 參數。

參數:
image浮點數或 uint 的 ndarray

要在其上視覺化模式的影像。

rint

包含特徵的矩形左上角的列座標。

cint

包含特徵的矩形左上角的行座標。

widthint

將用來計算特徵的 9 個相等矩形之一的寬度。

heightint

將用來計算特徵的 9 個相等矩形之一的高度。

lbp_code整數

要視覺化的特徵描述符。如果未提供,則會使用值為 0 的描述符。

color_greater_block3 個浮點數的元組

指定具有較高強度值的區塊顏色的浮點數。它們應在 [0, 1] 範圍內。對應的值定義 (R, G, B) 值。預設值為白色 (1, 1, 1)。

color_greater_block3 個浮點數的元組

指定具有較高強度值的區塊顏色的浮點數。它們應在 [0, 1] 範圍內。對應的值定義 (R, G, B) 值。預設值為青色 (0, 0.69, 0.96)。

alpha浮點數

範圍在 [0, 1] 的值,指定視覺化的不透明度。1 - 完全透明,0 - 不透明。

傳回值:
output浮點數的 ndarray

具有 MB-LBP 視覺化的影像。

參考文獻

[1]

L. Zhang, R. Chu, S. Xiang, S. Liao, S.Z. Li. “基於多區塊 LBP 表示的人臉偵測”,刊登於:生物識別技術進展,國際會議,ICB 2007,首爾,韓國。 http://www.cbsr.ia.ac.cn/users/scliao/papers/Zhang-ICB07-MBLBP.pdf DOI:10.1007/978-3-540-74549-5_2

用於紋理分類的多區塊局部二值模式

用於紋理分類的多區塊局部二值模式

skimage.feature.fisher_vector(descriptors, gmm, *, improved=False, alpha=0.5)[原始碼]#

計算給定一些描述符/向量和相關的估計 GMM 的費雪向量。

參數:
descriptorsnp.ndarray,形狀=(n_descriptors, descriptor_length)

要計算 Fisher 向量表示的描述符的 NumPy 陣列。

gmmsklearn.mixture.GaussianMixture

已估計的 GMM 物件,其中包含計算 Fisher 向量所需的必要參數。

improved布林值,預設值=False

表示是否計算改良的 Fisher 向量的旗標。改良的 Fisher 向量是經過 L2 和冪次正規化的。冪次正規化僅是 f(z) = sign(z) pow(abs(z), alpha),其中 0 <= alpha <= 1。

alpha浮點數,預設值=0.5

冪次正規化步驟的參數。如果 improved=False,則會忽略。

傳回值:
fisher_vectornp.ndarray

計算的 Fisher 向量,由 GMM 對其參數(混合權重、平均值和共變異數矩陣)的梯度串聯而成。對於 D 維輸入描述符或向量,以及 K 模式 GMM,Fisher 向量的維度將為 2KD + K。因此,其維度與描述符/向量的數量無關。

參考文獻

[1]

Perronnin, F. 和 Dance, C. 影像分類視覺詞彙上的 Fisher 核心,IEEE 電腦視覺和模式辨識會議,2007

[2]

Perronnin, F. 和 Sanchez, J. 和 Mensink T. 改良用於大型影像分類的 Fisher 核心,ECCV,2010

範例

>>> from skimage.feature import fisher_vector, learn_gmm
>>> sift_for_images = [np.random.random((10, 128)) for _ in range(10)]
>>> num_modes = 16
>>> # Estimate 16-mode GMM with these synthetic SIFT vectors
>>> gmm = learn_gmm(sift_for_images, n_modes=num_modes)
>>> test_image_descriptors = np.random.random((25, 128))
>>> # Compute the Fisher vector
>>> fv = fisher_vector(test_image_descriptors, gmm)

Fisher 向量特徵編碼

Fisher 向量特徵編碼

skimage.feature.graycomatrix(image, distances, angles, levels=None, symmetric=False, normed=False)[原始碼]#

計算灰階共生矩陣。

灰階共生矩陣是在影像上的給定偏移量處同時出現的灰階值的直方圖。

在 0.19 版中變更:greymatrix 在 0.19 版中重新命名為 graymatrix

參數:
image類陣列

整數類型輸入影像。僅支援正值影像。如果類型不是 uint8,則需要設定引數 levels

distances類陣列

像素對距離偏移量的清單。

angles類陣列

以弧度為單位的像素對角度清單。

levels整數,選用

輸入影像應包含 [0, levels-1] 中的整數,其中 levels 表示計算的灰階數量(對於 8 位元影像,通常為 256)。此引數對於 16 位元或更高的影像為必要,並且通常是影像的最大值。由於輸出矩陣至少為 levels x levels,因此最好使用輸入影像的裝箱,而不是 levels 的大值。

symmetric布林值,選用

如果為 True,則輸出矩陣 P[:, :, d, theta] 是對稱的。這是透過忽略值對的順序來完成的,因此當遇到給定偏移量的 (i, j) 時,(i, j) 和 (j, i) 都會被累加。預設值為 False。

normed布林值,選用

如果為 True,則透過除以給定偏移量的累加共生總數來正規化每個矩陣 P[:, :, d, theta]。結果矩陣的元素總和為 1。預設值為 False。

傳回值:
P4 維 ndarray

灰階共生直方圖。值 P[i,j,d,theta] 是灰階 j 在距離 d 處且與灰階 i 的角度 theta 處發生的次數。如果 normedFalse,則輸出類型為 uint32,否則為 float64。維度為:灰階數 x 灰階數 x 距離數 x 角度數。

參考文獻

[1]

M. Hall-Beyer, 2007。GLCM 紋理:教學 https://prism.ucalgary.ca/handle/1880/51900 DOI:10.11575/PRISM/33280

[2]

R.M. Haralick、K. Shanmugam 和 I. Dinstein,“用於影像分類的紋理特徵”,IEEE Transactions on Systems, Man, and Cybernetics,卷 SMC-3,第 6 期,第 610-621 頁,1973 年 11 月。DOI:10.1109/TSMC.1973.4309314

[3]

M. Nadler 和 E.P. Smith,《模式辨識工程》(Pattern Recognition Engineering),Wiley-Interscience,1993。

範例

計算 4 個灰階共生矩陣 (GLCM),使用 1 像素距離和 4 個不同的角度。例如,0 弧度的角度指的是右側相鄰的像素;pi/4 弧度指的是右上對角線相鄰的像素;pi/2 弧度指的是上方的像素,依此類推。

>>> image = np.array([[0, 0, 1, 1],
...                   [0, 0, 1, 1],
...                   [0, 2, 2, 2],
...                   [2, 2, 3, 3]], dtype=np.uint8)
>>> result = graycomatrix(image, [1], [0, np.pi/4, np.pi/2, 3*np.pi/4],
...                       levels=4)
>>> result[:, :, 0, 0]
array([[2, 2, 1, 0],
       [0, 2, 0, 0],
       [0, 0, 3, 1],
       [0, 0, 0, 1]], dtype=uint32)
>>> result[:, :, 0, 1]
array([[1, 1, 3, 0],
       [0, 1, 1, 0],
       [0, 0, 0, 2],
       [0, 0, 0, 0]], dtype=uint32)
>>> result[:, :, 0, 2]
array([[3, 0, 2, 0],
       [0, 2, 2, 0],
       [0, 0, 1, 2],
       [0, 0, 0, 0]], dtype=uint32)
>>> result[:, :, 0, 3]
array([[2, 0, 0, 0],
       [1, 1, 2, 0],
       [0, 0, 2, 1],
       [0, 0, 0, 0]], dtype=uint32)

灰階共生矩陣紋理特徵

灰階共生矩陣紋理特徵

skimage.feature.graycoprops(P, prop='contrast')[原始碼]#

計算 GLCM 的紋理屬性。

計算灰階共生矩陣的特徵,作為矩陣的簡潔摘要。屬性計算如下:

  • 「對比度」(contrast):\(\sum_{i,j=0}^{levels-1} P_{i,j}(i-j)^2\)

  • 「相異度」(dissimilarity):\(\sum_{i,j=0}^{levels-1}P_{i,j}|i-j|\)

  • 「同質性」(homogeneity):\(\sum_{i,j=0}^{levels-1}\frac{P_{i,j}}{1+(i-j)^2}\)

  • 「角二階矩」(ASM):\(\sum_{i,j=0}^{levels-1} P_{i,j}^2\)

  • 「能量」(energy):\(\sqrt{ASM}\)

  • 「相關性」(correlation)
    \[\sum_{i,j=0}^{levels-1} P_{i,j}\left[\frac{(i-\mu_i) \ (j-\mu_j)}{\sqrt{(\sigma_i^2)(\sigma_j^2)}}\right]\]
  • 「平均值」(mean):\(\sum_{i=0}^{levels-1} i*P_{i}\)

  • 「變異數」(variance):\(\sum_{i=0}^{levels-1} P_{i}*(i-mean)^2\)

  • 「標準差」(std):\(\sqrt{variance}\)

  • 「熵」(entropy):\(\sum_{i,j=0}^{levels-1} -P_{i,j}*log(P_{i,j})\)

每個灰階共生矩陣在計算紋理屬性之前,都會被正規化,使其總和為 1。

在版本 0.19 中變更:greycoprops 在 0.19 中更名為 graycoprops

參數:
Pndarray

輸入陣列。P 是要計算指定屬性的灰階共生直方圖。值 P[i,j,d,theta] 是灰階 j 在距離 d 和角度 theta 處,從灰階 i 出現的次數。

prop{'contrast', 'dissimilarity', 'homogeneity', 'energy', 'correlation', 'ASM', 'mean', 'variance', 'std', 'entropy'}, 可選

要計算的灰階共生矩陣的屬性。預設值為 'contrast'。

傳回值:
results二維 ndarray

二維陣列。results[d, a] 是第 d 個距離和第 a 個角度的屬性 'prop'。

參考文獻

[1]

M. Hall-Beyer,2007。《灰階共生矩陣紋理:教程 v. 1.0 到 3.0》(GLCM Texture: A Tutorial v. 1.0 through 3.0)。《灰階共生矩陣教程首頁》(The GLCM Tutorial Home Page),https://prism.ucalgary.ca/handle/1880/51900 DOI:10.11575/PRISM/33280

範例

計算距離為 [1, 2] 和角度為 [0 度, 90 度] 的灰階共生矩陣的對比度。

>>> image = np.array([[0, 0, 1, 1],
...                   [0, 0, 1, 1],
...                   [0, 2, 2, 2],
...                   [2, 2, 3, 3]], dtype=np.uint8)
>>> g = graycomatrix(image, [1, 2], [0, np.pi/2], levels=4,
...                  normed=True, symmetric=True)
>>> contrast = graycoprops(g, 'contrast')
>>> contrast
array([[0.58333333, 1.        ],
       [1.25      , 2.75      ]])

灰階共生矩陣紋理特徵

灰階共生矩陣紋理特徵

skimage.feature.haar_like_feature(int_image, r, c, width, height, feature_type=None, feature_coord=None)[原始碼]#

計算積分影像的感興趣區域 (ROI) 的 Haar 類特徵。

哈爾類特徵已成功用於影像分類和物件偵測 [1]。它已用於 [2] 中提出的即時臉部偵測演算法。

參數:
int_image(M, N) ndarray

需要計算特徵的積分影像。

rint

偵測視窗左上角的列座標。

cint

偵測視窗左上角的行座標。

widthint

偵測視窗的寬度。

heightint

偵測視窗的高度。

feature_typestr 或 str 的列表或 None,可選

要考慮的特徵類型

  • 「type-2-x」:沿著 x 軸變化的 2 個矩形;

  • 「type-2-y」:沿著 y 軸變化的 2 個矩形;

  • 「type-3-x」:沿著 x 軸變化的 3 個矩形;

  • 「type-3-y」:沿著 y 軸變化的 3 個矩形;

  • 「type-4」:沿著 x 和 y 軸變化的 4 個矩形。

預設會擷取所有特徵。

如果與 feature_coord 一起使用,它應該對應於每個相關座標特徵的特徵類型。

feature_coord元組的陣列清單或 None,選用

要提取的座標陣列。當您只想重新計算特徵的子集時,這非常有用。在這種情況下,feature_type 需要是包含每個特徵類型的陣列,如 haar_like_feature_coord() 所傳回。預設情況下,會計算所有座標。

傳回值:
haar_features(n_features,) ndarray,整數或浮點數

產生的哈爾類特徵。每個值都等於正矩形和負矩形的總和的減法。資料類型取決於 int_image 的資料類型:當 int_image 的資料類型為 uintint 時為 int,當 int_image 的資料類型為 float 時為 float

註解

當平行擷取這些特徵時,請注意後端(例如,多處理與多執行緒)的選擇會影響效能。經驗法則是:當擷取影像中所有可能 ROI 的特徵時,請使用多處理;當擷取有限數量的 ROI 的特定位置的特徵時,請使用多執行緒。請參閱範例 使用哈爾類特徵描述符的臉部分類 以取得更多見解。

參考文獻

[2]

Oren, M., Papageorgiou, C., Sinha, P., Osuna, E., & Poggio, T. (1997, June)。使用小波樣板的行人偵測。(Pedestrian detection using wavelet templates)。《電腦視覺與模式辨識,1997 年論文集》(In Computer Vision and Pattern Recognition, 1997. Proceedings., 1997 IEEE Computer Society Conference on (pp. 193-199))。IEEE。http://tinyurl.com/y6ulxfta DOI:10.1109/CVPR.1997.609319

[3]

Viola, Paul, 和 Michael J. Jones。「穩健的即時臉部偵測」。(Robust real-time face detection)。《國際電腦視覺期刊》(International journal of computer vision) 57.2 (2004): 137-154。https://www.merl.com/publications/docs/TR2004-043.pdf DOI:10.1109/CVPR.2001.990517

範例

>>> import numpy as np
>>> from skimage.transform import integral_image
>>> from skimage.feature import haar_like_feature
>>> img = np.ones((5, 5), dtype=np.uint8)
>>> img_ii = integral_image(img)
>>> feature = haar_like_feature(img_ii, 0, 0, 5, 5, 'type-3-x')
>>> feature
array([-1, -2, -3, -4, -5, -1, -2, -3, -4, -5, -1, -2, -3, -4, -5, -1, -2,
       -3, -4, -1, -2, -3, -4, -1, -2, -3, -4, -1, -2, -3, -1, -2, -3, -1,
       -2, -3, -1, -2, -1, -2, -1, -2, -1, -1, -1])

您可以計算一些預先計算的座標的特徵。

>>> from skimage.feature import haar_like_feature_coord
>>> feature_coord, feature_type = zip(
...     *[haar_like_feature_coord(5, 5, feat_t)
...       for feat_t in ('type-2-x', 'type-3-x')])
>>> # only select one feature over two
>>> feature_coord = np.concatenate([x[::2] for x in feature_coord])
>>> feature_type = np.concatenate([x[::2] for x in feature_type])
>>> feature = haar_like_feature(img_ii, 0, 0, 5, 5,
...                             feature_type=feature_type,
...                             feature_coord=feature_coord)
>>> feature
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,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, -1, -3, -5, -2, -4, -1,
       -3, -5, -2, -4, -2, -4, -2, -4, -2, -1, -3, -2, -1, -1, -1, -1, -1])

使用 Haar 類特徵描述符進行人臉分類

使用 Haar 類特徵描述符進行人臉分類

skimage.feature.haar_like_feature_coord(width, height, feature_type=None)[原始碼]#

計算 Haar 類特徵的座標。

參數:
widthint

偵測視窗的寬度。

heightint

偵測視窗的高度。

feature_typestr 或 str 的列表或 None,可選

要考慮的特徵類型

  • 「type-2-x」:沿著 x 軸變化的 2 個矩形;

  • 「type-2-y」:沿著 y 軸變化的 2 個矩形;

  • 「type-3-x」:沿著 x 軸變化的 3 個矩形;

  • 「type-3-y」:沿著 y 軸變化的 3 個矩形;

  • 「type-4」:沿著 x 和 y 軸變化的 4 個矩形。

預設會擷取所有特徵。

傳回值:
feature_coord(n_features, n_rectangles, 2, 2),ndarray,元組座標列表

每個特徵的矩形座標。

feature_type(n_features,),ndarray,str

每個特徵的對應類型。

範例

>>> import numpy as np
>>> from skimage.transform import integral_image
>>> from skimage.feature import haar_like_feature_coord
>>> feat_coord, feat_type = haar_like_feature_coord(2, 2, 'type-4')
>>> feat_coord 
array([ list([[(0, 0), (0, 0)], [(0, 1), (0, 1)],
              [(1, 1), (1, 1)], [(1, 0), (1, 0)]])], dtype=object)
>>> feat_type
array(['type-4'], dtype=object)

Haar 類特徵描述符

Haar 類特徵描述符

使用 Haar 類特徵描述符進行人臉分類

使用 Haar 類特徵描述符進行人臉分類

skimage.feature.hessian_matrix(image, sigma=1, mode='constant', cval=0, order='rc', use_gaussian_derivatives=None)[原始碼]#

計算 Hessian 矩陣。

在 2D 中,Hessian 矩陣定義為

H = [Hrr Hrc]
    [Hrc Hcc]

它是透過將影像與高斯核在各自 r 和 c 方向的二階導數進行卷積來計算的。

此處的實作也支援 n 維資料。

參數:
imagendarray

輸入影像。

sigma浮點數

用於高斯核的標準差,它用作自相關矩陣的加權函數。

mode{‘constant’, ‘reflect’, ‘wrap’, ‘nearest’, ‘mirror’}, 選填

如何處理影像邊界之外的值。

cvalfloat,可選

與模式 'constant' 結合使用時,影像邊界之外的值。

order{'rc', 'xy'}, 可選

對於 2D 影像,此參數允許在梯度計算中使用影像軸的反向或正向順序。「rc」表示最初使用第一個軸 (Hrr, Hrc, Hcc),而「xy」表示最初使用最後一個軸 (Hxx, Hxy, Hyy)。維度較高的影像必須始終使用「rc」順序。

use_gaussian_derivatives布林值,可選

指示 Hessian 是透過與高斯導數卷積來計算,還是透過簡單的有限差分運算來計算。

傳回值:
H_elemsndarray 的列表

輸入影像中每個像素的 Hessian 矩陣的上對角元素。在 2D 中,這將是一個包含 [Hrr, Hrc, Hcc] 的三個元素列表。在 nD 中,該列表將包含 (n**2 + n) / 2 個陣列。

註解

導數和卷積的分配性質允許我們將影像 I 與高斯核 G 平滑的導數重新敘述為影像與 G 的導數的卷積。

\[\frac{\partial }{\partial x_i}(I * G) = I * \left( \frac{\partial }{\partial x_i} G \right)\]

use_gaussian_derivativesTrue 時,此屬性會用於計算構成 Hessian 矩陣的二階導數。

use_gaussian_derivativesFalse 時,則會改為使用高斯平滑影像上的簡單有限差分。

範例

>>> from skimage.feature import hessian_matrix
>>> square = np.zeros((5, 5))
>>> square[2, 2] = 4
>>> Hrr, Hrc, Hcc = hessian_matrix(square, sigma=0.1, order='rc',
...                                use_gaussian_derivatives=False)
>>> Hrc
array([[ 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.]])

skimage.feature.hessian_matrix_det(image, sigma=1, approximate=True)[原始碼]#

計算影像上的近似 Hessian 行列式。

2D 近似方法使用積分影像上的盒狀濾波器來計算近似的 Hessian 行列式。

參數:
imagendarray

用於計算 Hessian 行列式的影像。

sigmafloat,可選

用於 Hessian 矩陣的高斯核函數的標準差。

approximate布林值,可選

如果為 True 且影像為 2D,則使用更快的近似計算。此引數對 3D 和更高維度的影像無效。

傳回值:
out陣列

Hessian 行列式的陣列。

註解

對於 2D 影像,當 approximate=True 時,此方法的執行時間僅取決於影像的大小。它與 sigma 無關,這是一般預期的。缺點是 sigma 小於 3 的結果不準確,也就是說,與有人計算 Hessian 並取其行列式所得的結果不相似。

參考文獻

[1]

Herbert Bay, Andreas Ess, Tinne Tuytelaars, Luc Van Gool, “SURF: Speeded Up Robust Features” ftp://ftp.vision.ee.ethz.ch/publications/articles/eth_biwi_00517.pdf


skimage.feature.hessian_matrix_eigvals(H_elems)[原始碼]#

計算 Hessian 矩陣的特徵值。

參數:
H_elemsndarray 的列表

Hessian 矩陣的上對角元素,由 hessian_matrix 傳回。

傳回值:
eigsndarray

Hessian 矩陣的特徵值,依遞減順序排列。特徵值是前導維度。也就是說,eigs[i, j, k] 包含位置 (j, k) 的第 i 個最大特徵值。

範例

>>> from skimage.feature import hessian_matrix, hessian_matrix_eigvals
>>> square = np.zeros((5, 5))
>>> square[2, 2] = 4
>>> H_elems = hessian_matrix(square, sigma=0.1, order='rc',
...                          use_gaussian_derivatives=False)
>>> hessian_matrix_eigvals(H_elems)[0]
array([[ 0.,  0.,  2.,  0.,  0.],
       [ 0.,  1.,  0.,  1.,  0.],
       [ 2.,  0., -2.,  0.,  2.],
       [ 0.,  1.,  0.,  1.,  0.],
       [ 0.,  0.,  2.,  0.,  0.]])

skimage.feature.hog(image, orientations=9, pixels_per_cell=(8, 8), cells_per_block=(3, 3), block_norm='L2-Hys', visualize=False, transform_sqrt=False, feature_vector=True, *, channel_axis=None)[原始碼]#

提取給定影像的方向梯度直方圖 (HOG)。

透過以下步驟計算定向梯度直方圖 (HOG):

  1. (可選) 全域影像正規化

  2. 計算 rowcol 中的梯度影像

  3. 計算梯度直方圖

  4. 在區塊之間進行正規化

  5. 展平為特徵向量

參數:
image(M, N[, C]) ndarray

輸入影像。

orientationsint,選用

方向箱的數量。

pixels_per_cell2 元組 (int, int),可選

單元格的大小 (以像素為單位)。

cells_per_block2 元組 (int, int),可選

每個區塊中的單元格數量。

block_norm字串 {‘L1’, ‘L1-sqrt’, ‘L2’, ‘L2-Hys’},可選

區塊正規化方法

L1

使用 L1 範數進行正規化。

L1-sqrt

使用 L1 範數進行正規化,然後進行平方根運算。

L2

使用 L2 範數進行正規化。

L2-Hys

使用 L2 範數進行正規化,然後將最大值限制為 0.2 (Hys 代表 遲滯),並使用 L2 範數進行重新正規化。(預設) 如需詳細資訊,請參閱 [3][4]

visualizebool,選用

也會傳回 HOG 的影像。對於每個單元格和方向箱,影像包含一個線段,該線段以單元格中心為中心,垂直於方向箱跨越的角度範圍的中點,並且強度與對應的直方圖值成正比。

transform_sqrt布林值,可選

在處理之前套用冪律壓縮來正規化影像。如果影像包含負值,請勿使用此方法。另請參閱下方的 notes 區段。

feature_vector布林值,可選

在傳回之前,透過對結果呼叫 .ravel() 將資料傳回為特徵向量。

channel_axis整數或 None,可選

如果為 None,則假設影像為灰階 (單一通道) 影像。否則,此參數表示陣列的哪個軸對應於通道。

在 0.19 版本中新增: channel_axis 已在 0.19 中新增。

傳回值:
out(n_blocks_row, n_blocks_col, n_cells_row, n_cells_col, n_orient) ndarray

影像的 HOG 描述元。如果 feature_vector 為 True,則會傳回 1D (展平) 陣列。

hog_image(M, N) ndarray,可選

HOG 影像的可視化。僅當 visualize 為 True 時才會提供。

引發:
ValueError

如果影像太小,而 pixels_per_cell 和 cells_per_block 的值過大。

註解

所呈現的程式碼實作了來自 [2] 的 HOG 提取方法,其中進行了以下變更:(I) 使用 (3, 3) 單元格的區塊 (論文中為 (2, 2));(II) 單元格內沒有平滑處理 (論文中使用 σ=8 像素的高斯空間視窗);(III) 使用 L1 區塊正規化 (論文中使用 L2-Hys)。

冪律壓縮 (也稱為 Gamma 校正) 用於減少陰影和光照變化的影響。壓縮使暗區變亮。當 kwarg transform_sqrt 設定為 True 時,該函式會計算每個色彩通道的平方根,然後將 hog 演算法套用至影像。

參考文獻

[2]

Dalal, N 和 Triggs, B, Histograms of Oriented Gradients for Human Detection, IEEE Computer Society Conference on Computer Vision and Pattern Recognition 2005 San Diego, CA, USA, https://lear.inrialpes.fr/people/triggs/pubs/Dalal-cvpr05.pdf, DOI:10.1109/CVPR.2005.177

[3]

Lowe, D.G., Distinctive image features from scale-invatiant keypoints, International Journal of Computer Vision (2004) 60: 91, http://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf, DOI:10.1023/B:VISI.0000029664.99615.94

[4]

Dalal, N, Finding People in Images and Videos, Human-Computer Interaction [cs.HC], Institut National Polytechnique de Grenoble - INPG, 2006, https://tel.archives-ouvertes.fr/tel-00390303/file/NavneetDalalThesis.pdf

定向梯度直方圖

定向梯度直方圖

skimage.feature.learn_gmm(descriptors, *, n_modes=32, gm_args=None)[原始碼]#

根據一組描述符和模式數量(即高斯分佈)估計高斯混合模型 (GMM)。此函數本質上是 scikit-learn GMM 實現的包裝器,即 sklearn.mixture.GaussianMixture 類別。

由於費雪向量的特性,底層 scikit-learn 類別唯一強制執行的參數是 covariance_type,其值必須為 ‘diag’。

沒有簡單的方法可以事先知道要使用哪個 n_modes 值。通常,該值通常是 {16, 32, 64, 128} 中的一個。可以訓練幾個 GMM,然後選擇使 GMM 的對數機率最大化的那個,或者選擇 n_modes,使得在所得費雪向量上訓練的下游分類器的效能最大。

參數:
descriptorsnp.ndarray (N, M) 或 list [(N1, M), (N2, M), …]

用於估計 GMM 的描述符的 NumPy 陣列列表或單個 NumPy 陣列。允許使用 NumPy 陣列列表的原因是,通常在使用費雪向量編碼時,會針對資料集中的每個樣本/圖像單獨計算描述符/向量,例如每個圖像的 SIFT 向量。如果傳入列表,則每個元素都必須是 NumPy 陣列,其中行數可能不同(例如,每個圖像的 SIFT 向量數量不同),但每個元素的列數必須相同(即維度必須相同)。

n_modesint

在 GMM 估計期間要估計的模式/高斯分佈數量。

gm_argsdict

可以傳遞到基礎 scikit-learn sklearn.mixture.GaussianMixture 類別的關鍵字參數。

傳回值:
gmmsklearn.mixture.GaussianMixture

估計的 GMM 物件,其中包含計算費雪向量所需的必要參數。

參考文獻

範例

>>> from skimage.feature import fisher_vector
>>> rng = np.random.Generator(np.random.PCG64())
>>> sift_for_images = [rng.standard_normal((10, 128)) for _ in range(10)]
>>> num_modes = 16
>>> # Estimate 16-mode GMM with these synthetic SIFT vectors
>>> gmm = learn_gmm(sift_for_images, n_modes=num_modes)

Fisher 向量特徵編碼

Fisher 向量特徵編碼

skimage.feature.local_binary_pattern(image, P, R, method='default')[source]#

計算影像的局部二元模式 (LBP)。

LBP 是一種視覺描述符,常用於紋理分類。

參數:
image(M, N) array

2D 灰階影像。

Pint

圓對稱鄰居設定點的數量(角度空間的量化)。

Rfloat

圓的半徑(運算子的空間解析度)。

methodstr {‘default’, ‘ror’, ‘uniform’, ‘nri_uniform’, ‘var’},可選

決定模式的方法

default

原始局部二元模式,灰階不變,但旋轉不變。

ror

default 模式的擴展,灰階不變且旋轉不變。

uniform

均勻模式,灰階不變且旋轉不變,可提供更精細的角度空間量化。詳情請參閱 [1]

nri_uniform

均勻模式的變體,灰階不變但旋轉不變。詳情請參閱 [2][3]

var

局部影像紋理的變異數(與對比度相關),旋轉不變但灰階不變。

傳回值:
output(M, N) 陣列

LBP 影像。

參考文獻

[1]

T. Ojala、M. Pietikainen、T. Maenpaa,「Multiresolution gray-scale and rotation invariant texture classification with local binary patterns」,IEEE Transactions on Pattern Analysis and Machine Intelligence,vol. 24, no. 7, pp. 971-987, July 2002 DOI:10.1109/TPAMI.2002.1017623

[2]

T. Ahonen、A. Hadid 和 M. Pietikainen。「Face recognition with local binary patterns」,載於 Proc. Eighth European Conf. Computer Vision, Prague, Czech Republic, May 11-14, 2004, pp. 469-481, 2004。http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.214.6851 DOI:10.1007/978-3-540-24670-1_36

[3]

T. Ahonen、A. Hadid 和 M. Pietikainen,「Face Description with Local Binary Patterns: Application to Face Recognition」,IEEE Transactions on Pattern Analysis and Machine Intelligence,vol. 28, no. 12, pp. 2037-2041, Dec. 2006 DOI:10.1109/TPAMI.2006.244

用於紋理分類的局部二元模式

用於紋理分類的局部二元模式

skimage.feature.match_descriptors(descriptors1, descriptors2, metric=None, p=2, max_distance=inf, cross_check=True, max_ratio=1.0)[source]#

描述符的暴力匹配。

對於第一組中的每個描述符,此比對器會在第二組中找到最接近的描述符(如果啟用交叉檢查,則反之亦然)。

參數:
descriptors1(M, P) 陣列

第一張影像中關於 M 個關鍵點的大小為 P 的描述符。

descriptors2(N, P) 陣列

第二張影像中關於 N 個關鍵點的大小為 P 的描述符。

metric{‘euclidean’, ‘cityblock’, ‘minkowski’, ‘hamming’, …} ,可選

計算兩個描述符之間距離的度量。有關所有可能的類型,請參閱 scipy.spatial.distance.cdist。漢明距離應用於二元描述符。預設情況下,L2 範數用於所有 dtype 為 float 或 double 的描述符,而漢明距離則自動用於二元描述符。

pint,可選

要應用於 metric='minkowski' 的 p 範數。

max_distancefloat,可選

視為比對的單獨影像中兩個關鍵點描述符之間允許的最大距離。

cross_checkbool,可選

如果為 True,則會在交叉檢查後傳回比對的關鍵點,即,如果 keypoint2 是第二張影像中 keypoint1 的最佳比對,且 keypoint1 是第一張影像中 keypoint2 的最佳比對,則傳回比對組 (keypoint1, keypoint2)。

max_ratiofloat,可選

第二組描述符中第一和第二個最接近描述符之間距離的最大比率。此閾值對於篩選兩個描述符集之間的模糊比對很有用。此值的選擇取決於所選描述符的統計資訊,例如,對於 SIFT 描述符,通常選擇值 0.8,請參閱 D.G. Lowe,「Distinctive Image Features from Scale-Invariant Keypoints」,International Journal of Computer Vision, 2004。

傳回值:
matches(Q, 2) 陣列

第一組和第二組描述符中對應比對的索引,其中 matches[:, 0] 表示第一組的索引,而 matches[:, 1] 則表示第二組描述符的索引。

基本矩陣估計

基本矩陣估計

ORB 特徵偵測器和二元描述符

ORB 特徵偵測器和二元描述符

BRIEF 二元描述子

BRIEF 二元描述子

SIFT 特徵偵測器和描述符提取器

SIFT 特徵偵測器和描述符提取器

skimage.feature.match_template(image, template, pad_input=False, mode='constant', constant_values=0)[source]#

使用正規化相關性將範本與 2D 或 3D 影像進行比對。

輸出是一個值介於 -1.0 和 1.0 之間的陣列。給定位置的值對應於影像和模板之間的相關係數。

對於 pad_input=True,比對對應於模板的中心,否則對應於模板的左上角。若要找到最佳比對,您必須在回應 (輸出) 影像中搜尋峰值。

參數:
image(M, N[, P]) 陣列

2D 或 3D 輸入影像。

template(m, n[, p]) 陣列

要定位的模板。必須為 (m <= M, n <= N[, p <= P])

pad_inputbool

如果為 True,則填補 image,使輸出與影像大小相同,且輸出值對應於模板中心。否則,對於 (M, N) 影像和 (m, n) 模板,輸出是形狀為 (M - m + 1, N - n + 1) 的陣列,而比對對應於模板的原點(左上角)。

mode請參閱 numpy.pad,可選

填補模式。

constant_values請參閱 numpy.pad,選填

mode='constant' 搭配使用的常數值。

傳回值:
output陣列

包含相關係數的回應影像。

註解

交叉相關的詳細資訊請參閱 [1]。此實作使用影像與樣板的 FFT 卷積。參考資料 [2] 提出了類似的推導,但我們實作中未使用此參考資料中呈現的近似值。

參考文獻

[1]

J. P. Lewis, “快速標準化交叉相關”, Industrial Light and Magic。

[2]

Briechle 和 Hanebeck, “使用快速標準化交叉相關的樣板匹配”, SPIE 會議記錄 (2001)。DOI:10.1117/12.421129

範例

>>> template = np.zeros((3, 3))
>>> template[1, 1] = 1
>>> template
array([[0., 0., 0.],
       [0., 1., 0.],
       [0., 0., 0.]])
>>> image = np.zeros((6, 6))
>>> image[1, 1] = 1
>>> image[4, 4] = -1
>>> image
array([[ 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., -1.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.]])
>>> result = match_template(image, template)
>>> np.round(result, 3)
array([[ 1.   , -0.125,  0.   ,  0.   ],
       [-0.125, -0.125,  0.   ,  0.   ],
       [ 0.   ,  0.   ,  0.125,  0.125],
       [ 0.   ,  0.   ,  0.125, -1.   ]])
>>> result = match_template(image, template, pad_input=True)
>>> np.round(result, 3)
array([[-0.125, -0.125, -0.125,  0.   ,  0.   ,  0.   ],
       [-0.125,  1.   , -0.125,  0.   ,  0.   ,  0.   ],
       [-0.125, -0.125, -0.125,  0.   ,  0.   ,  0.   ],
       [ 0.   ,  0.   ,  0.   ,  0.125,  0.125,  0.125],
       [ 0.   ,  0.   ,  0.   ,  0.125, -1.   ,  0.125],
       [ 0.   ,  0.   ,  0.   ,  0.125,  0.125,  0.125]])

樣板匹配

樣板匹配

skimage.feature.multiblock_lbp(int_image, r, c, width, height)[原始碼]#

多區塊局部二元模式 (MB-LBP)。

此特徵的計算方式類似於局部二元模式 (LBP),(請參閱 local_binary_pattern()),但使用的是總和區塊而非個別像素值。

MB-LBP 是 LBP 的延伸,可以使用積分影像在恆定時間內以多種尺度計算。使用九個大小相等的矩形來計算特徵。對於每個矩形,計算像素強度的總和。將這些總和與中心矩形的總和進行比較,以確定特徵,這與 LBP 類似。

參數:
int_image(N, M) 陣列

積分影像。

rint

包含特徵的矩形左上角的列座標。

cint

包含特徵的矩形左上角的行座標。

widthint

用於計算特徵的 9 個相等矩形之一的寬度。

heightint

用於計算特徵的 9 個相等矩形之一的高度。

傳回值:
outputint

8 位元 MB-LBP 特徵描述符。

參考文獻

[1]

L. Zhang, R. Chu, S. Xiang, S. Liao, S.Z. Li. “基於多區塊 LBP 表示的人臉偵測”,刊登於:生物識別技術進展,國際會議,ICB 2007,首爾,韓國。 http://www.cbsr.ia.ac.cn/users/scliao/papers/Zhang-ICB07-MBLBP.pdf DOI:10.1007/978-3-540-74549-5_2

用於紋理分類的多區塊局部二值模式

用於紋理分類的多區塊局部二值模式

skimage.feature.multiscale_basic_features(image, intensity=True, edges=True, texture=True, sigma_min=0.5, sigma_max=16, num_sigma=None, num_workers=None, *, channel_axis=None)[原始碼]#

單通道或多通道 nd 影像的局部特徵。

由於高斯模糊,因此以不同尺度計算強度、梯度強度和局部結構。

參數:
imagendarray

輸入影像,可以是灰階或多通道。

intensitybool,預設為 True

如果為 True,則將不同尺度上平均的像素強度新增至特徵集。

edgesbool,預設為 True

如果為 True,則將不同尺度上平均的局部梯度強度新增至特徵集。

texturebool,預設為 True

如果為 True,則將高斯模糊後不同尺度的 Hessian 矩陣特徵值新增至特徵集。

sigma_minfloat,選填

用於在擷取特徵之前平均局部鄰域的高斯核心最小值。

sigma_maxfloat,選填

用於在擷取特徵之前平均局部鄰域的高斯核心最大值。

num_sigmaint,可選

sigma_min 和 sigma_max 之間的高斯核心值數量。如果為 None,則使用乘以 2 的冪的 sigma_min 值。

num_workersint 或 None,選填

要使用的平行執行緒數量。如果設定為 None,則會使用所有可用的核心。

channel_axis整數或 None,可選

如果為 None,則假設影像為灰階 (單一通道) 影像。否則,此參數表示陣列的哪個軸對應於通道。

在 0.19 版中新增:在 0.19 版中新增了 channel_axis

傳回值:
featuresnp.ndarray

形狀為 image.shape + (n_features,) 的陣列。當 channel_axis 不是 None 時,所有通道都會沿著特徵維度串連。(即 n_features == n_features_singlechannel * n_channels

使用局部特徵和隨機森林的可訓練分割

使用局部特徵和隨機森林的可訓練分割

skimage.feature.peak_local_max(image, min_distance=1, threshold_abs=None, threshold_rel=None, exclude_border=True, num_peaks=inf, footprint=None, labels=None, num_peaks_per_label=inf, p_norm=inf)[原始碼]#

在影像中尋找峰值作為座標清單。

峰值是 2 * min_distance + 1 區域中的局部最大值(即峰值之間至少間隔 min_distance)。

如果同時提供了 threshold_absthreshold_rel,則選擇兩者中的最大值作為峰值的最小強度閾值。

在 0.18 版中變更:在 0.18 版之前,會傳回 min_distance 半徑內相同高度的峰值,但這可能會導致非預期的行為。從 0.18 版開始,會傳回該區域內的任意峰值。請參閱問題 gh-2592。

參數:
imagendarray

輸入影像。

min_distanceint, 選填

峰值之間間隔的最小允許距離。若要尋找最大峰值數量,請使用 min_distance=1

threshold_absfloat 或 None,選填

峰值的最小強度。預設情況下,絕對閾值是影像的最小強度。

threshold_rel浮點數或 None,可選

峰值的最小強度,計算方式為 max(image) * threshold_rel

exclude_borderint、整數的元組或 bool,選填

如果為正整數,exclude_border 會排除影像邊界 exclude_border 像素範圍內的峰值。如果為非負整數的元組,則該元組的長度必須與輸入陣列的維度一致。元組中的每個元素都會排除影像該維度邊界 exclude_border 像素範圍內的峰值。如果為 True,則將 min_distance 參數作為值。如果為零或 False,則會識別峰值,無論其與邊界的距離為何。

num_peaksint,選填

最大峰值數量。當峰值數量超過 num_peaks 時,會根據最高的峰值強度傳回 num_peaks 個峰值。

footprintbools 的 ndarray,選填

如果提供,footprint == 1 表示在 image 中每個點尋找峰值的局部區域。

labels整數的 ndarray,選填

如果提供,每個唯一區域 labels == value 代表要尋找峰值的唯一區域。零保留用於背景。

num_peaks_per_labelint,選填

每個標籤的最大峰值數量。

p_normfloat

要使用的 Minkowski p 範數。應在 [1, inf] 範圍內。如果可能發生溢位,有限大的 p 可能會導致 ValueError。inf 對應於切比雪夫距離,而 2 對應於歐幾里得距離。

傳回值:
outputndarray

峰值的座標。

註解

峰值局部最大值函數會傳回影像中局部峰值(最大值)的座標。在內部,使用最大值濾波器來尋找局部最大值。此運算會擴張原始影像。在比較擴張後的影像和原始影像後,此函數會傳回擴張後的影像等於原始影像的峰值座標。

範例

>>> img1 = np.zeros((7, 7))
>>> img1[3, 4] = 1
>>> img1[3, 2] = 1.5
>>> img1
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.5, 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. ]])
>>> peak_local_max(img1, min_distance=1)
array([[3, 2],
       [3, 4]])
>>> peak_local_max(img1, min_distance=2)
array([[3, 2]])
>>> img2 = np.zeros((20, 20, 20))
>>> img2[10, 10, 10] = 1
>>> img2[15, 15, 15] = 1
>>> peak_idx = peak_local_max(img2, exclude_border=0)
>>> peak_idx
array([[10, 10, 10],
       [15, 15, 15]])
>>> peak_mask = np.zeros_like(img2, dtype=bool)
>>> peak_mask[tuple(peak_idx.T)] = True
>>> np.argwhere(peak_mask)
array([[10, 10, 10],
       [15, 15, 15]])

尋找局部最大值

尋找局部最大值

分水嶺分割

分水嶺分割

分割人類細胞(有絲分裂)

分割人類細胞(有絲分裂)

skimage.feature.plot_matched_features(image0, image1, *, keypoints0, keypoints1, matches, ax, keypoints_color='k', matches_color=None, only_matches=False, alignment='horizontal')[原始碼]#

繪製兩個影像之間比對的特徵。

在版本 0.23 中新增。

參數:
image0(N, M [, 3]) 陣列

第一張圖片。

image1(N, M [, 3]) 陣列

第二張圖片。

keypoints0(K1, 2) 陣列

第一個關鍵點座標,格式為 (列, 行)

keypoints1(K2, 2) 陣列

第二個關鍵點座標,格式為 (列, 行)

matches(Q, 2) 陣列

第一組和第二組描述符中對應匹配項的索引,其中 matches[:, 0] (或 matches[:, 1]) 包含第一組 (或第二組) 描述符中的索引。

axmatplotlib.axes.Axes

用於繪製圖片及其匹配特徵的 Axes 物件。

keypoints_colormatplotlib 顏色,選用

關鍵點位置的顏色。

matches_colormatplotlib 顏色或顏色序列,選用

matches 定義的每條線的單一顏色或顏色序列,這些線連接關鍵點匹配項。有關支援的顏色格式的概述,請參閱 [1]。預設情況下,顏色會隨機選擇。

only_matchesbool,選用

設定為 True 時,僅繪製匹配項,而不繪製關鍵點位置。

alignment{‘horizontal’, ‘vertical’},選用

選擇將兩張圖片並排顯示 ('horizontal'),還是一張在另一張之上顯示 ('vertical')。

註解

為了使傳遞給 matches_color 的顏色序列適用於任意數量的 matches,您可以將該序列包裝在 itertools.cycle() 中。

參考文獻

基本矩陣估計

基本矩陣估計

使用 RANSAC 的穩健匹配

使用 RANSAC 的穩健匹配

ORB 特徵偵測器和二元描述符

ORB 特徵偵測器和二元描述符

BRIEF 二元描述子

BRIEF 二元描述子

SIFT 特徵偵測器和描述符提取器

SIFT 特徵偵測器和描述符提取器

skimage.feature.shape_index(image, sigma=1, mode='constant', cval=0)[原始碼]#

計算形狀索引。

形狀索引(由 Koenderink & van Doorn [1] 定義)是局部曲率的單一值度量,假設圖片為 3D 平面,強度表示高度。

它從 Hessian 的特徵值導出,其值範圍從 -1 到 1(在平坦區域中為未定義 (=NaN)),以下範圍代表以下形狀

形狀索引的範圍和對應的形狀。#

間隔(s 在...中)

形狀

[ -1, -7/8)

球形杯

[-7/8, -5/8)

凹槽

[-5/8, -3/8)

溝槽

[-3/8, -1/8)

鞍型溝槽

[-1/8, +1/8)

鞍形

[+1/8, +3/8)

鞍型脊

[+3/8, +5/8)

[+5/8, +7/8)

圓頂

[+7/8, +1]

球形帽

參數:
image(M, N) ndarray

輸入影像。

sigmafloat,可選

用於高斯核心的標準差,該高斯核心用於在 Hessian 特徵值計算之前平滑輸入資料。

mode{‘constant’, ‘reflect’, ‘wrap’, ‘nearest’, ‘mirror’}, 選填

如何處理圖片邊界外的值

cvalfloat,可選

與模式 'constant' 結合使用時,影像邊界之外的值。

傳回值:
sndarray

形狀索引

參考文獻

[1]

Koenderink, J. J. & van Doorn, A. J., “Surface shape and curvature scales”, Image and Vision Computing, 1992, 10, 557-564. DOI:10.1016/0262-8856(92)90076-F

範例

>>> from skimage.feature import shape_index
>>> square = np.zeros((5, 5))
>>> square[2, 2] = 4
>>> s = shape_index(square, sigma=0.1)
>>> s
array([[ nan,  nan, -0.5,  nan,  nan],
       [ nan, -0. ,  nan, -0. ,  nan],
       [-0.5,  nan, -1. ,  nan, -0.5],
       [ nan, -0. ,  nan, -0. ,  nan],
       [ nan,  nan, -0.5,  nan,  nan]])

形狀索引

形狀索引

skimage.feature.structure_tensor(image, sigma=1, mode='constant', cval=0, order='rc')[原始碼]#

使用平方差之和計算結構張量。

(二維)結構張量 A 定義為

A = [Arr Arc]
    [Arc Acc]

它透過圖片中每個像素周圍局部視窗中平方差的加權總和來近似。此公式可以擴展到更多維度(請參閱 [1])。

參數:
imagendarray

輸入影像。

sigmafloat 或 float 類陣列,選用

用於高斯核心的標準差,該高斯核心用作局部平方差總和的加權函數。如果 sigma 是可迭代的,則其長度必須等於 image.ndim,並且每個元素都用於沿其各自軸套用的高斯核心。

mode{‘constant’, ‘reflect’, ‘wrap’, ‘nearest’, ‘mirror’}, 選填

如何處理影像邊界之外的值。

cvalfloat,可選

與模式 'constant' 結合使用時,影像邊界之外的值。

order{'rc', 'xy'}, 可選

注意:'xy' 僅適用於 2D 圖片,更高的維度必須始終使用 'rc' 順序。此參數允許在梯度計算中使用圖片軸的反向或正向順序。 'rc' 表示最初使用第一個軸 (Arr, Arc, Acc),而 'xy' 表示最初使用最後一個軸 (Axx, Axy, Ayy)。

傳回值:
A_elemsndarray 列表

輸入圖片中每個像素的結構張量上對角線元素。

參考文獻

範例

>>> from skimage.feature import structure_tensor
>>> square = np.zeros((5, 5))
>>> square[2, 2] = 1
>>> Arr, Arc, Acc = structure_tensor(square, sigma=0.1, order='rc')
>>> Acc
array([[0., 0., 0., 0., 0.],
       [0., 1., 0., 1., 0.],
       [0., 4., 0., 4., 0.],
       [0., 1., 0., 1., 0.],
       [0., 0., 0., 0., 0.]])

估計 3D 顯微鏡影像中的各向異性

估計 3D 顯微鏡影像中的各向異性

skimage.feature.structure_tensor_eigenvalues(A_elems)[原始碼]#

計算結構張量的特徵值。

參數:
A_elemsndarray 列表

結構張量的上對角線元素,由 structure_tensor 傳回。

傳回值:
eigenvaluesndarray

結構張量的特徵值,以遞減順序排列。特徵值是主導維度。也就是說,座標 [i, j, k] 對應於位置 (j, k) 的第 i 個最大特徵值。

另請參閱

structure_tensor

範例

>>> from skimage.feature import structure_tensor
>>> from skimage.feature import structure_tensor_eigenvalues
>>> square = np.zeros((5, 5))
>>> square[2, 2] = 1
>>> A_elems = structure_tensor(square, sigma=0.1, order='rc')
>>> structure_tensor_eigenvalues(A_elems)[0]
array([[0., 0., 0., 0., 0.],
       [0., 2., 4., 2., 0.],
       [0., 4., 0., 4., 0.],
       [0., 2., 4., 2., 0.],
       [0., 0., 0., 0., 0.]])

估計 3D 顯微鏡影像中的各向異性

估計 3D 顯微鏡影像中的各向異性
class skimage.feature.BRIEF(descriptor_size=256, patch_size=49, mode='normal', sigma=1, rng=1)[原始碼]#

基礎:DescriptorExtractor

BRIEF 二元描述符提取器。

BRIEF(二元強健獨立基本特徵)是一種有效的特徵點描述符。即使使用相對較少的位元,它也具有高度的區別性,並且是使用簡單的強度差異測試來計算的。

對於每個關鍵點,針對特定分佈的 N 個像素對執行強度比較,從而產生長度為 N 的二元描述符。對於二元描述符,可以使用漢明距離來進行特徵匹配,這與 L2 範數相比,可以降低計算成本。

參數:
descriptor_sizeint,選用

每個關鍵點的 BRIEF 描述符大小。作者建議的大小為 128、256 和 512。預設值為 256。

patch_sizeint,選用

關鍵點周圍二維方形色塊採樣區域的長度。預設值為 49。

mode{‘normal’, ‘uniform’},選用

關鍵點周圍決策像素對的採樣位置的機率分佈。

rng{numpy.random.Generator, 整數},選用

偽隨機數生成器 (RNG)。預設情況下,會使用 PCG64 生成器 (請參閱 numpy.random.default_rng())。如果 rng 是一個整數,它會被用來作為生成器的種子。

PRNG 用於決策像素對的隨機採樣。從長度為 patch_size 的方形窗口中,像素對會使用 mode 參數進行採樣,以利用強度比較來建立描述子。

為了在不同影像之間進行匹配,應該使用相同的 rng 來建構描述子。為了方便起見,

  1. rng 預設值為 1

  2. 後續調用 extract 方法將使用相同的 rng/種子。

sigmafloat,可選

應用於影像的高斯低通濾波器的標準差,以減輕雜訊敏感度,強烈建議使用此方法來獲得有區分性和良好的描述子。

屬性:
descriptors(Q, descriptor_size) 布林值 dtype 陣列

大小為 descriptor_size 的二元描述子的 2D ndarray,適用於 Q 個關鍵點,在過濾掉邊界關鍵點後,索引 (i, j) 的值為 TrueFalse,表示第 i 個關鍵點在第 j 個決策像素對上的強度比較結果。其中 Q == np.sum(mask)

mask(N,) 布林值 dtype 陣列

遮罩指示關鍵點是否已被過濾掉 (False) 或在 descriptors 陣列中描述 (True)。

範例

>>> from skimage.feature import (corner_harris, corner_peaks, BRIEF,
...                              match_descriptors)
>>> import numpy as np
>>> square1 = np.zeros((8, 8), dtype=np.int32)
>>> square1[2:6, 2:6] = 1
>>> square1
array([[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, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 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, 0]], dtype=int32)
>>> square2 = np.zeros((9, 9), dtype=np.int32)
>>> square2[2:7, 2:7] = 1
>>> square2
array([[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, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 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, 0, 0, 0, 0, 0, 0, 0]], dtype=int32)
>>> keypoints1 = corner_peaks(corner_harris(square1), min_distance=1)
>>> keypoints2 = corner_peaks(corner_harris(square2), min_distance=1)
>>> extractor = BRIEF(patch_size=5)
>>> extractor.extract(square1, keypoints1)
>>> descriptors1 = extractor.descriptors
>>> extractor.extract(square2, keypoints2)
>>> descriptors2 = extractor.descriptors
>>> matches = match_descriptors(descriptors1, descriptors2)
>>> matches
array([[0, 0],
       [1, 1],
       [2, 2],
       [3, 3]])
>>> keypoints1[matches[:, 0]]
array([[2, 2],
       [2, 5],
       [5, 2],
       [5, 5]])
>>> keypoints2[matches[:, 1]]
array([[2, 2],
       [2, 6],
       [6, 2],
       [6, 6]])
__init__(descriptor_size=256, patch_size=49, mode='normal', sigma=1, rng=1)[原始碼]#

BRIEF 二元描述子

BRIEF 二元描述子
extract(image, keypoints)[原始碼]#

為影像中給定的關鍵點提取 BRIEF 二元描述子。

參數:
image2D 陣列

輸入影像。

keypoints(N, 2) 陣列

關鍵點座標為 (row, col)

class skimage.feature.CENSURE(min_scale=1, max_scale=7, mode='DoB', non_max_threshold=0.15, line_threshold=10)[原始碼]#

基礎: FeatureDetector

CENSURE 關鍵點偵測器。

min_scaleint,可選

要從中提取關鍵點的最小尺度。

max_scaleint,可選

要從中提取關鍵點的最大尺度。關鍵點將從所有尺度中提取,除了第一個和最後一個,即從 [min_scale + 1, max_scale - 1] 範圍內的尺度。不同尺度的濾波器大小,使得兩個相鄰的尺度包含一個八度音階。

mode{‘DoB’, ‘Octagon’, ‘STAR’},可選

用於取得輸入影像尺度的雙層濾波器類型。可能的值為 ‘DoB’、’Octagon’ 和 ‘STAR’。這三種模式分別代表雙層濾波器的形狀,即方塊(正方形)、八邊形和星形。例如,雙層八邊形濾波器由一個較小的內八邊形和一個較大的外八邊形組成,濾波器權重在內八邊形中均勻為負,而在差值區域中均勻為正。使用 STAR 和 Octagon 可獲得更好的特徵,使用 DoB 可獲得更好的效能。

non_max_thresholdfloat,可選

用於抑制在非最大抑制後獲得的、具有較弱幅度響應的最大值和最小值的閾值。

line_thresholdfloat,可選

用於拒絕主曲率比大於此值的興趣點的閾值。

屬性:
keypoints(N, 2) 陣列

關鍵點座標為 (row, col)

scales(N,) 陣列

對應的尺度。

參考文獻

[1]

Motilal Agrawal、Kurt Konolige 和 Morten Rufus Blas “CENSURE: Center Surround Extremas for Realtime Feature Detection and Matching”,https://link.springer.com/chapter/10.1007/978-3-540-88693-8_8 DOI:10.1007/978-3-540-88693-8_8

[2]

Adam Schmidt、Marek Kraft、Michal Fularz 和 Zuzanna Domagala “Comparative Assessment of Point Feature Detectors and Descriptors in the Context of Robot Navigation” http://yadda.icm.edu.pl/yadda/element/bwmeta1.element.baztech-268aaf28-0faf-4872-a4df-7e2e61cb364c/c/Schmidt_comparative.pdf DOI:10.1.1.465.1117

範例

>>> from skimage.data import astronaut
>>> from skimage.color import rgb2gray
>>> from skimage.feature import CENSURE
>>> img = rgb2gray(astronaut()[100:300, 100:300])
>>> censure = CENSURE()
>>> censure.detect(img)
>>> censure.keypoints
array([[  4, 148],
       [ 12,  73],
       [ 21, 176],
       [ 91,  22],
       [ 93,  56],
       [ 94,  22],
       [ 95,  54],
       [100,  51],
       [103,  51],
       [106,  67],
       [108,  15],
       [117,  20],
       [122,  60],
       [125,  37],
       [129,  37],
       [133,  76],
       [145,  44],
       [146,  94],
       [150, 114],
       [153,  33],
       [154, 156],
       [155, 151],
       [184,  63]])
>>> censure.scales
array([2, 6, 6, 2, 4, 3, 2, 3, 2, 6, 3, 2, 2, 3, 2, 2, 2, 3, 2, 2, 4, 2,
       2])
__init__(min_scale=1, max_scale=7, mode='DoB', non_max_threshold=0.15, line_threshold=10)[原始碼]#

CENSURE 特徵檢測器

CENSURE 特徵檢測器
detect(image)[原始碼]#

偵測 CENSURE 關鍵點及其對應的尺度。

參數:
image2D ndarray

輸入影像。

class skimage.feature.Cascade#

基礎: object

用於物件偵測的分類器串聯類別。

級聯分類器背後的主要概念是建立中等精度的分類器,並將其組合成一個強分類器,而不是僅建立一個強分類器。級聯分類器的第二個優點是,簡單的範例可以僅通過評估級聯中的某些分類器來分類,這使得該過程比評估一個強分類器的過程快得多。

屬性:
epscnp.float32_t

準確度參數。增加此參數會使分類器偵測到較少的偽陽性,但同時偽陰性分數也會增加。

stages_numberPy_ssize_t

級聯中的階段數。每個級聯都包含樹樁,即經過訓練的特徵。

stumps_numberPy_ssize_t

級聯所有階段中樹樁的總數。

features_numberPy_ssize_t

級聯使用的不同特徵的總數。兩個樹樁可以使用相同的特徵,但具有不同的訓練值。

window_widthPy_ssize_t

使用的偵測視窗的寬度。小於此視窗的物件無法被偵測到。

window_heightPy_ssize_t

偵測視窗的高度。

stagesStage*

指向 C 陣列的指標,該陣列使用 Stage 結構儲存階段資訊。

featuresMBLBP*

指向 C 陣列的指標,該陣列使用 MBLBP 結構儲存 MBLBP 特徵。

LUTscnp.uint32_t*

指向 C 陣列的指標,該陣列包含經過訓練的 MBLBP 特徵 (MBLBPStumps) 使用的查找表,以評估特定區域。

註解

級聯方法最早由 Viola 和 Jones 提出[1][2],儘管這些最初的出版物使用了一組 Haar-like 特徵。此實作改為使用多尺度區塊局部二元模式 (MB-LBP) 特徵[3]

參考文獻

[1]

Viola, P. 和 Jones, M. “使用增強級聯簡單特徵的快速物件偵測”,In: 2001 年 IEEE 電腦學會電腦視覺與模式辨識會議論文集。CVPR 2001, pp. I-I. DOI:10.1109/CVPR.2001.990517

[2]

Viola, P. 和 Jones, M.J, “穩健的即時臉部偵測”, 國際電腦視覺期刊 57, 137–154 (2004). DOI:10.1023/B:VISI.0000013087.49260.fb

[3]

Liao, S. 等人。用於臉部辨識的學習多尺度區塊局部二元模式。國際生物辨識會議 (ICB), 2007, pp. 828-837。In: 電腦科學講義, 第 4642 卷。施普林格,柏林,海德堡。 DOI:10.1007/978-3-540-74549-5_87

__init__()#

初始化級聯分類器。

參數:
xml_file檔案路徑或檔案物件

OpenCv 格式的檔案,其中載入所有級聯分類器的參數。

epscnp.float32_t

準確度參數。增加此參數會使分類器偵測到較少的偽陽性,但同時偽陰性分數也會增加。

使用級聯分類器進行臉部偵測

使用級聯分類器進行臉部偵測
detect_multi_scale(img, scale_factor, step_ratio, min_size, max_size, min_neighbor_number=4, intersection_score_threshold=0.5)#

在輸入影像的多個尺度上搜尋物件。

此函數會接收輸入影像、搜尋視窗在每個步驟中乘以的縮放因子、指定將應用於輸入影像以偵測物件的搜尋視窗的間隔的最小視窗大小和最大視窗大小。

參數:
img2 維或 3 維 ndarray

代表輸入影像的 Ndarray。

scale_factorcnp.float32_t

搜尋視窗在每個步驟中乘以的縮放比例。

step_ratiocnp.float32_t

影像的每個尺度上搜尋步驟所乘的比例。1 代表窮舉搜尋,通常速度較慢。將此參數設定為較高的值,結果會較差,但計算速度會快得多。通常,[1, 1.5] 區間中的值會產生良好的結果。

min_sizetuple (int, int)

搜尋視窗的最小尺寸。

max_sizetuple (int, int)

搜尋視窗的最大尺寸。

min_neighbor_numberint

為讓偵測被函數批准,最小的相交偵測數量。

intersection_score_thresholdcnp.float32_t

為了將兩個偵測合併為一個,(相交面積)/(較小矩形比例) 的最小比例值。

傳回值:
output字典列表

字典的形式為 {'r': int, 'c': int, 'width': int, 'height': int},其中 'r' 代表偵測到視窗的左上角列位置,'c' 代表行位置,'width' 代表偵測到視窗的寬度,'height' 代表偵測到視窗的高度。

eps#
features_number#
stages_number#
stumps_number#
window_height#
window_width#
class skimage.feature.ORB(downscale=1.2, n_scales=8, n_keypoints=500, fast_n=9, fast_threshold=0.08, harris_k=0.04)[原始碼]#

基底:FeatureDetectorDescriptorExtractor

定向 FAST 和旋轉 BRIEF 特徵偵測器和二元描述符提取器。

參數:
n_keypointsint,選用

要傳回的關鍵點數。如果偵測到的關鍵點數大於 n_keypoints,則此函數會傳回根據 Harris 角落響應的最佳 n_keypoints。否則,則會傳回所有偵測到的關鍵點。

fast_nint,選用

skimage.feature.corner_fast 中的 n 參數。圓圈上 16 個像素中,連續像素的最小數量,這些像素相對於測試像素,應該全部都更亮或更暗。如果 Ic < Ip - threshold,則圓圈上的點 c 相對於測試像素 p 更暗,如果 Ic > Ip + threshold,則更亮。也代表 FAST-n 角落偵測器中的 n。

fast_thresholdfloat,選用

feature.corner_fast 中的 threshold 參數。用於決定圓圈上的像素相對於測試像素是更亮、更暗還是相似的閾值。當需要更多角落時,降低閾值,反之亦然。

harris_kfloat,選用

skimage.feature.corner_harris 中的 k 參數。將角落從邊緣分離的靈敏度因子,通常在 [0, 0.2] 範圍內。較小的 k 值會導致偵測到銳利的角落。

downscalefloat,選用

影像金字塔的縮減比例因子。選擇預設值 1.2,以便有更多密集的尺度,從而為後續的特徵描述提供穩健的尺度不變性。

n_scalesint,選用

從影像金字塔底部提取特徵的最大尺度數。

屬性:
keypoints(N, 2) 陣列

關鍵點座標為 (row, col)

scales(N,) 陣列

對應的尺度。

orientations(N,) 陣列

對應的弧度方向。

responses(N,) 陣列

對應的 Harris 角落響應。

descriptors(Q, descriptor_size) 布林值 dtype 陣列

過濾掉邊界關鍵點後,Q 個關鍵點的二元描述子二維陣列,其大小為 descriptor_size,索引 (i, j) 的值為 TrueFalse,代表第 i 個關鍵點在第 j 個決定像素對上的強度比較結果。它是 Q == np.sum(mask)

參考文獻

[1]

Ethan Rublee、Vincent Rabaud、Kurt Konolige 和 Gary Bradski “ORB:SIFT 和 SURF 的有效替代方案” http://www.vision.cs.chubu.ac.jp/CV-R/pdf/Rublee_iccv2011.pdf

範例

>>> from skimage.feature import ORB, match_descriptors
>>> img1 = np.zeros((100, 100))
>>> img2 = np.zeros_like(img1)
>>> rng = np.random.default_rng(19481137)  # do not copy this value
>>> square = rng.random((20, 20))
>>> img1[40:60, 40:60] = square
>>> img2[53:73, 53:73] = square
>>> detector_extractor1 = ORB(n_keypoints=5)
>>> detector_extractor2 = ORB(n_keypoints=5)
>>> detector_extractor1.detect_and_extract(img1)
>>> detector_extractor2.detect_and_extract(img2)
>>> matches = match_descriptors(detector_extractor1.descriptors,
...                             detector_extractor2.descriptors)
>>> matches
array([[0, 0],
       [1, 1],
       [2, 2],
       [3, 4],
       [4, 3]])
>>> detector_extractor1.keypoints[matches[:, 0]]
array([[59. , 59. ],
       [40. , 40. ],
       [57. , 40. ],
       [46. , 58. ],
       [58.8, 58.8]])
>>> detector_extractor2.keypoints[matches[:, 1]]
array([[72., 72.],
       [53., 53.],
       [70., 53.],
       [59., 71.],
       [72., 72.]])
__init__(downscale=1.2, n_scales=8, n_keypoints=500, fast_n=9, fast_threshold=0.08, harris_k=0.04)[原始碼]#

基本矩陣估計

基本矩陣估計

ORB 特徵偵測器和二元描述符

ORB 特徵偵測器和二元描述符

Fisher 向量特徵編碼

Fisher 向量特徵編碼
detect(image)[原始碼]#

偵測具有方向性的 FAST 關鍵點以及對應的尺度。

參數:
image2D 陣列

輸入影像。

detect_and_extract(image)[原始碼]#

偵測具有方向性的 FAST 關鍵點並提取 rBRIEF 描述符。

請注意,這比先呼叫 detect 然後再呼叫 extract 來得更快。

參數:
image2D 陣列

輸入影像。

extract(image, keypoints, scales, orientations)[原始碼]#

針對影像中給定的關鍵點提取 rBRIEF 二元描述符。

請注意,關鍵點必須使用相同的 downscalen_scales 參數提取。此外,如果您想同時提取關鍵點和描述符,您應該使用更快的 detect_and_extract

參數:
image2D 陣列

輸入影像。

keypoints(N, 2) 陣列

關鍵點座標為 (row, col)

scales(N,) 陣列

對應的尺度。

orientations(N,) 陣列

對應的弧度方向。

class skimage.feature.SIFT(upsampling=2, n_octaves=8, n_scales=3, sigma_min=1.6, sigma_in=0.5, c_dog=0.013333333333333334, c_edge=10, n_bins=36, lambda_ori=1.5, c_max=0.8, lambda_descr=6, n_hist=4, n_ori=8)[原始碼]#

基底:FeatureDetectorDescriptorExtractor

SIFT 特徵偵測和描述符提取。

參數:
upsamplingint,可選

在特徵偵測之前,影像會以 1(不放大)、2 或 4 的因子進行放大。方法:雙立方插值。

n_octavesint,可選

最大八度音階數。隨著每個八度音階,影像大小會減半,而 sigma 會加倍。八度音階數將會根據需要減少,以保持在最小尺度上沿每個維度至少 12 個像素。

n_scalesint,選用

每個八度音階的最大尺度數。

sigma_minfloat,選填

種子影像的模糊程度。如果啟用了放大,sigma_min 會以 1/upsampling 的因子縮放

sigma_infloat,可選

輸入影像的假設模糊程度。

c_dogfloat,可選

用於捨棄 DoG 中低對比度極值的閾值。其最終值取決於 n_scales,關係式為:final_c_dog = (2^(1/n_scales)-1) / (2^(1/3)-1) * c_dog

c_edgefloat,可選

用於捨棄位於邊緣的極值的閾值。如果 H 是極值的黑森矩陣,則其「邊緣性」由 tr(H)²/det(H) 描述。如果邊緣性高於 (c_edge + 1)²/c_edge,則會捨棄該極值。

n_binsint,可選

直方圖中用於描述關鍵點周圍梯度方向的區間數。

lambda_orifloat,可選

用於尋找關鍵點參考方向的視窗寬度為 6 * lambda_ori * sigma,並以 2 * lambda_ori * sigma 的標準差進行加權。

c_maxfloat,可選

接受方向直方圖中第二個峰值作為方向的閾值

lambda_descrfloat,可選

用於定義關鍵點描述符的視窗寬度為 2 * lambda_descr * sigma * (n_hist+1)/n_hist,並以 lambda_descr * sigma 的標準差進行加權。

n_histint,可選

用於定義關鍵點描述符的視窗由 n_hist * n_hist 個直方圖組成。

n_oriint,可選

描述符塊中直方圖的區間數。

屬性:
delta_minfloat

第一個八度音階的取樣距離。其最終值為 1/upsampling。

float_dtypetype

影像的資料類型。

scalespace_sigmas(n_octaves, n_scales + 3) 陣列

所有八度音階中所有尺度的 sigma 值。

keypoints(N, 2) 陣列

關鍵點座標為 (row, col)

positions(N, 2) 陣列

以次像素精度的關鍵點座標,形式為 (列, 行)

sigmas(N,) 陣列

關鍵點對應的 sigma(模糊)值。

scales(N,) 陣列

關鍵點對應的尺度。

orientations(N,) 陣列

每個關鍵點周圍的梯度方向。

octaves(N,) 陣列

關鍵點對應的八度音階。

descriptors(N, n_hist*n_hist*n_ori) 陣列

關鍵點的描述符。

註解

SIFT 演算法由 David Lowe [1][2] 開發,後來由英屬哥倫比亞大學取得專利。由於專利於 2020 年到期,因此可以免費使用。此處的實作密切遵循 [3] 中的詳細描述,包括使用相同的預設參數。

參考文獻

[1]

D.G. Lowe. “Object recognition from local scale-invariant features”, Proceedings of the Seventh IEEE International Conference on Computer Vision, 1999, vol.2, pp. 1150-1157. DOI:10.1109/ICCV.1999.790410

[2]

D.G. Lowe. “Distinctive Image Features from Scale-Invariant Keypoints”, International Journal of Computer Vision, 2004, vol. 60, pp. 91–110. DOI:10.1023/B:VISI.0000029664.99615.94

[3]

I. R. Otero and M. Delbracio. “Anatomy of the SIFT Method”, Image Processing On Line, 4 (2014), pp. 370–396. DOI:10.5201/ipol.2014.82

範例

>>> from skimage.feature import SIFT, match_descriptors
>>> from skimage.data import camera
>>> from skimage.transform import rotate
>>> img1 = camera()
>>> img2 = rotate(camera(), 90)
>>> detector_extractor1 = SIFT()
>>> detector_extractor2 = SIFT()
>>> detector_extractor1.detect_and_extract(img1)
>>> detector_extractor2.detect_and_extract(img2)
>>> matches = match_descriptors(detector_extractor1.descriptors,
...                             detector_extractor2.descriptors,
...                             max_ratio=0.6)
>>> matches[10:15]
array([[ 10, 412],
       [ 11, 417],
       [ 12, 407],
       [ 13, 411],
       [ 14, 406]])
>>> detector_extractor1.keypoints[matches[10:15, 0]]
array([[ 95, 214],
       [ 97, 211],
       [ 97, 218],
       [102, 215],
       [104, 218]])
>>> detector_extractor2.keypoints[matches[10:15, 1]]
array([[297,  95],
       [301,  97],
       [294,  97],
       [297, 102],
       [293, 104]])
__init__(upsampling=2, n_octaves=8, n_scales=3, sigma_min=1.6, sigma_in=0.5, c_dog=0.013333333333333334, c_edge=10, n_bins=36, lambda_ori=1.5, c_max=0.8, lambda_descr=6, n_hist=4, n_ori=8)[原始碼]#

SIFT 特徵偵測器和描述符提取器

SIFT 特徵偵測器和描述符提取器
property deltas#

所有八度音階的採樣距離

detect(image)[原始碼]#

偵測關鍵點。

參數:
image2D 陣列

輸入影像。

detect_and_extract(image)[原始碼]#

偵測關鍵點並提取它們的描述符。

參數:
image2D 陣列

輸入影像。

extract(image)[原始碼]#

提取圖像中所有關鍵點的描述符。

參數:
image2D 陣列

輸入影像。