skimage.feature
#
特徵偵測和提取,例如紋理分析、角點等。
在給定的灰階影像中尋找斑點。 |
|
在給定的灰階影像中尋找斑點。 |
|
在給定的灰階影像中尋找斑點。 |
|
使用 Canny 演算法對影像進行邊緣濾波。 |
|
提取給定影像的 FAST 角點。 |
|
計算 Foerstner 角點測量響應影像。 |
|
計算 Harris 角點測量響應影像。 |
|
計算 Kitchen 和 Rosenfeld 角點測量響應影像。 |
|
計算 Moravec 角點測量響應影像。 |
|
計算角點的方向。 |
|
在角點測量響應影像中尋找峰值。 |
|
計算 Shi-Tomasi (Kanade-Tomasi) 角點測量響應影像。 |
|
決定角點的次像素位置。 |
|
為給定影像密集提取 DAISY 特徵描述符。 |
|
Haar 類特徵的可視化。 |
|
多區塊局部二元模式可視化。 |
|
計算給定一些描述符/向量和相關的估計 GMM 的費雪向量。 |
|
計算灰階共生矩陣。 |
|
計算 GLCM 的紋理屬性。 |
|
計算積分影像的感興趣區域 (ROI) 的 Haar 類特徵。 |
|
計算 Haar 類特徵的座標。 |
|
計算 Hessian 矩陣。 |
|
計算影像上的近似 Hessian 行列式。 |
|
計算 Hessian 矩陣的特徵值。 |
|
提取給定影像的方向梯度直方圖 (HOG)。 |
|
給定一組描述符和模式數量(即高斯分佈),估計高斯混合模型 (GMM)。 |
|
計算影像的局部二元模式 (LBP)。 |
|
描述符的暴力匹配。 |
|
使用正規化相關性將範本與 2D 或 3D 影像進行比對。 |
|
多區塊局部二元模式 (MB-LBP)。 |
|
單通道或多通道 nd 影像的局部特徵。 |
|
在影像中尋找峰值作為座標清單。 |
|
繪製兩個影像之間比對的特徵。 |
|
計算形狀索引。 |
|
使用平方差之和計算結構張量。 |
|
計算結構張量的特徵值。 |
|
BRIEF 二元描述符提取器。 |
|
CENSURE 關鍵點偵測器。 |
|
用於物件偵測的分類器串聯類別。 |
|
定向 FAST 和旋轉 BRIEF 特徵偵測器和二元描述符提取器。 |
|
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_sigma
和max_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_sigma
和max_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 陣列 (影像)
二元邊緣圖。
註解
演算法的步驟如下
使用寬度為
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)
- 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]])
- 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, 選填
峰值之間允許的最小距離。
- **
- 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]])
- 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]])
- 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],但在以下幾點有所不同
- 參數:
- 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 描述子的視覺化。
參考文獻
- 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. ]]])
- 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 陣列。
- gmm
sklearn.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)
- 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
xlevels
,因此最好使用輸入影像的裝箱,而不是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
處發生的次數。如果normed
為False
,則輸出類型為 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()
所傳回。預設情況下,會計算所有座標。
- 傳回值:
註解
當平行擷取這些特徵時,請注意後端(例如,多處理與多執行緒)的選擇會影響效能。經驗法則是:當擷取影像中所有可能 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])
- 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)
- 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_derivatives
為True
時,此屬性會用於計算構成 Hessian 矩陣的二階導數。當
use_gaussian_derivatives
為False
時,則會改為使用高斯平滑影像上的簡單有限差分。範例
>>> 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):
(可選) 全域影像正規化
計算
row
和col
中的梯度影像計算梯度直方圖
在區塊之間進行正規化
展平為特徵向量
- 參數:
- image(M, N[, C]) ndarray
輸入影像。
- orientationsint,選用
方向箱的數量。
- pixels_per_cell2 元組 (int, int),可選
單元格的大小 (以像素為單位)。
- cells_per_block2 元組 (int, int),可選
每個區塊中的單元格數量。
- block_norm字串 {‘L1’, ‘L1-sqrt’, ‘L2’, ‘L2-Hys’},可選
區塊正規化方法
- 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
類別的關鍵字參數。
- 傳回值:
- gmm
sklearn.mixture.GaussianMixture
估計的 GMM 物件,其中包含計算費雪向量所需的必要參數。
- 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)
- 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’},可選
決定模式的方法
- 傳回值:
- 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]
則表示第二組描述符的索引。
- 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_abs
和threshold_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()
中。參考文獻
- 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.]])
- skimage.feature.structure_tensor_eigenvalues(A_elems)[原始碼]#
計算結構張量的特徵值。
- 參數:
- A_elemsndarray 列表
結構張量的上對角線元素,由
structure_tensor
傳回。
- 傳回值:
- eigenvaluesndarray
結構張量的特徵值,以遞減順序排列。特徵值是主導維度。也就是說,座標 [i, j, k] 對應於位置 (j, k) 的第 i 個最大特徵值。
另請參閱
範例
>>> 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.]])
- 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
來建構描述子。為了方便起見,rng
預設值為 1後續調用
extract
方法將使用相同的 rng/種子。
- sigmafloat,可選
應用於影像的高斯低通濾波器的標準差,以減輕雜訊敏感度,強烈建議使用此方法來獲得有區分性和良好的描述子。
- 屬性:
- descriptors(Q,
descriptor_size
) 布林值 dtype 陣列 大小為
descriptor_size
的二元描述子的 2D ndarray,適用於 Q 個關鍵點,在過濾掉邊界關鍵點後,索引(i, j)
的值為True
或False
,表示第 i 個關鍵點在第 j 個決策像素對上的強度比較結果。其中Q == np.sum(mask)
。- mask(N,) 布林值 dtype 陣列
遮罩指示關鍵點是否已被過濾掉 (
False
) 或在descriptors
陣列中描述 (True
)。
- descriptors(Q,
範例
>>> 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]])
- 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])
- 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)[原始碼]#
基底:
FeatureDetector
、DescriptorExtractor
定向 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)
的值為True
或False
,代表第 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)[原始碼]#
- detect_and_extract(image)[原始碼]#
偵測具有方向性的 FAST 關鍵點並提取 rBRIEF 描述符。
請注意,這比先呼叫
detect
然後再呼叫extract
來得更快。- 參數:
- image2D 陣列
輸入影像。
- extract(image, keypoints, scales, orientations)[原始碼]#
針對影像中給定的關鍵點提取 rBRIEF 二元描述符。
請注意,關鍵點必須使用相同的
downscale
和n_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)[原始碼]#
基底:
FeatureDetector
、DescriptorExtractor
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)[原始碼]#
- property deltas#
所有八度音階的採樣距離