skimage.filters
#
銳化、邊緣偵測、排序濾波器、閾值處理等。
將遲滯閾值處理應用於 |
|
套用巴特沃斯濾波器以增強高頻或低頻特徵。 |
|
計算 |
|
找出大小介於 |
|
使用 Farid 轉換找出邊緣強度。 |
|
使用 Farid 轉換找出影像的水平邊緣。 |
|
使用 Farid 轉換找出影像的垂直邊緣。 |
|
將給定的濾波器套用於資料。 |
|
將濾波器反向套用於給定的資料。 |
|
使用 Frangi 血管濾波器過濾影像。 |
|
傳回 Gabor 濾波器的實部和虛部響應。 |
|
傳回複數 2D Gabor 濾波器核心。 |
|
多維高斯濾波器。 |
|
使用混合 Hessian 濾波器過濾影像。 |
|
使用拉普拉斯算子找出影像的邊緣。 |
|
傳回影像的局部中位數。 |
|
使用 Meijering 神經元濾波器過濾影像。 |
|
使用 Prewitt 轉換找出邊緣強度。 |
|
使用 Prewitt 轉換找出影像的水平邊緣。 |
|
使用 Prewitt 轉換找出影像的垂直邊緣。 |
|
傳回形狀相同的影像,其中每個像素都是 |
|
使用 Roberts' 交叉算子找出邊緣強度。 |
|
使用 Roberts' 交叉算子找出影像的交叉邊緣。 |
|
使用 Roberts' 交叉算子找出影像的交叉邊緣。 |
|
使用 Sato 管狀濾波器過濾影像。 |
|
使用 Scharr 轉換找出邊緣強度。 |
|
使用 Scharr 轉換找出影像的水平邊緣。 |
|
使用 Scharr 轉換找出影像的垂直邊緣。 |
|
使用 Sobel 濾波器找出影像中的邊緣。 |
|
使用 Sobel 轉換找出影像的水平邊緣。 |
|
使用 Sobel 轉換找出影像的垂直邊緣。 |
|
傳回基於 ISODATA 方法的閾值。 |
|
透過 Li 的迭代最小交叉熵方法計算閾值。 |
|
根據局部像素鄰域計算閾值遮罩影像。 |
|
傳回基於灰度值平均值的閾值。 |
|
傳回基於最小值方法的閾值。 |
|
產生 |
|
將 Niblack 局部閾值套用於陣列。 |
|
傳回基於 Otsu 方法的閾值。 |
|
將 Sauvola 局部閾值套用於陣列。 |
|
傳回基於三角形演算法的閾值。 |
|
傳回基於 Yen 方法的閾值。 |
|
傳回比較不同閾值處理方法輸出的圖形。 |
|
非銳化遮罩濾波器。 |
|
最小均方誤差 (維納) 反向濾波器。 |
|
傳回給定大小和維度的 n 維視窗。 |
|
線性位置不變濾波器(二維) |
|
- skimage.filters.apply_hysteresis_threshold(image, low, high)[原始碼]#
將遲滯閾值處理應用於
image
。此演算法會找出
image
大於high
,或image
大於low
且該區域連接到大於high
的區域的位置。- 參數:
- image(M[, …]) ndarray
灰階輸入影像。
- lowfloat,或與
image
形狀相同的陣列 較低閾值。
- highfloat,或與
image
形狀相同的陣列 較高閾值。
- 傳回:
- thresholded(M[, …]) 布林陣列
陣列中,
True
表示image
高於遲滯閾值的位置。
參考資料
[1]J. Canny. A computational approach to edge detection. IEEE Transactions on Pattern Analysis and Machine Intelligence. 1986; vol. 8, pp.679-698. DOI:10.1109/TPAMI.1986.4767851
範例
>>> image = np.array([1, 2, 3, 2, 1, 2, 1, 3, 2]) >>> apply_hysteresis_threshold(image, 1.5, 2.5).astype(int) array([0, 1, 1, 1, 0, 0, 0, 1, 1])
- skimage.filters.butterworth(image, cutoff_frequency_ratio=0.005, high_pass=True, order=2.0, channel_axis=None, *, squared_butterworth=True, npad=0)[原始碼]#
套用巴特沃斯濾波器以增強高頻或低頻特徵。
此濾波器定義在傅立葉域中。
- 參數:
- image(M[, N[, …, P]][, C]) ndarray
輸入影像。
- cutoff_frequency_ratiofloat,選填
決定相對於 FFT 形狀的截止位置。接收介於 [0, 0.5] 之間的值。
- high_passbool,選填
是否執行高通濾波器。若為 False,則執行低通濾波器。
- orderfloat,選填
濾波器的階數,會影響截止附近的斜率。階數越高,頻率空間中的斜率越陡峭。
- channel_axisint,選填
若有通道維度,請在此處提供索引。若為 None(預設值),則假設所有軸都是空間維度。
- squared_butterworthbool,選填
若為 True,則使用巴特沃斯濾波器的平方。如需詳細資訊,請參閱以下注意事項。
- npadint,選填
使用
numpy.pad
的mode='edge'
擴充功能,將影像的每個邊緣使用npad
像素進行填補。
- 傳回:
- resultndarray
經過巴特沃斯濾波的影像。
注意事項
可透過結合高通和低通濾波器來達成帶通濾波器。若邊界出現假影,使用者可以增加
npad
。影像處理教科書中使用的「巴特沃斯濾波器」(例如 [1]、[2])通常是 [3]、[4] 所述的傳統巴特沃斯濾波器的平方。若
squared_butterworth
設定為True
,則會在此處使用平方版本。低通平方巴特沃斯濾波器由以下低通情況的表達式給定\[H_{low}(f) = \frac{1}{1 + \left(\frac{f}{c f_s}\right)^{2n}}\]而高通情況由下式給定
\[H_{hi}(f) = 1 - H_{low}(f)\]其中 \(f=\sqrt{\sum_{d=0}^{\mathrm{ndim}} f_{d}^{2}}\) 是空間頻率的絕對值,\(f_s\) 是取樣頻率,\(c\) 是
cutoff_frequency_ratio
,且 \(n\) 是濾波器的order
[1]。當squared_butterworth=False
時,會改為使用上述表達式的平方根。請注意,
cutoff_frequency_ratio
是以取樣頻率 \(f_s\) 來定義的。FFT 頻譜涵蓋奈奎斯特範圍 (\([-f_s/2, f_s/2]\)),因此cutoff_frequency_ratio
的值應介於 0 到 0.5 之間。當squared_butterworth
為 true 時,截止頻率處的頻率響應(增益)為 0.5;當其為 false 時,頻率響應為 \(1/\sqrt{2}\)。參考資料
[2]Birchfield, Stan. Image Processing and Analysis. 2018. Cengage Learning.
[3]Butterworth, Stephen. “On the theory of filter amplifiers.” Wireless Engineer 7.6 (1930): 536-541.
範例
分別對灰階和彩色圖像應用高通和低通巴特沃斯濾波器
>>> from skimage.data import camera, astronaut >>> from skimage.filters import butterworth >>> high_pass = butterworth(camera(), 0.07, True, 8) >>> low_pass = butterworth(astronaut(), 0.01, False, 4, channel_axis=-1)
- skimage.filters.correlate_sparse(image, kernel, mode='reflect')[原始碼]#
計算
padded_array
和kernel
的有效交叉相關。當
kernel
很大且有許多零時,此函數會非常快。有關交叉相關的說明,請參閱
scipy.ndimage.correlate
。- 參數:
- imagendarray,dtype 為 float,形狀為 (M, N[, …], P)
輸入陣列。如果 mode 為 ‘valid’,則此陣列應已填補,因為會剝離與 kernel 形狀相同的邊距。
- kernelndarray,dtype 為 float,形狀為 (Q, R[, …], S)
要進行相關的 kernel。必須與
padded_array
具有相同的維度數量。為了獲得高效能,它應該是稀疏的(非零條目很少)。- mode字串,可選
有關有效模式,請參閱
scipy.ndimage.correlate
。此外,接受模式 ‘valid’,在這種情況下,不會應用填補,結果是針對 kernel 完全在原始資料內部的較小影像的結果。
- 傳回:
- result浮點數陣列,形狀為 (M, N[, …], P)
將
image
與kernel
進行交叉相關的結果。如果使用模式 ‘valid’,則結果形狀為 (M-Q+1, N-R+1[, …], P-S+1)。
- skimage.filters.difference_of_gaussians(image, low_sigma, high_sigma=None, *, mode='nearest', cval=0, channel_axis=None, truncate=4.0)[原始碼]#
找出大小介於
low_sigma
和high_sigma
之間的特徵。此函數使用高斯差分方法對多維陣列應用帶通濾波器。輸入陣列會使用兩個具有不同 sigma 的高斯 kernel 模糊化,以產生兩個中間的過濾影像。然後,從模糊較少的影像中減去模糊較多的影像。因此,最終輸出影像將因較小 sigma 的高斯而衰減高頻成分,並且由於它們存在於模糊較多的中間值中,因此會移除低頻成分。
- 參數:
- imagendarray
要過濾的輸入陣列。
- low_sigma純量或純量序列
具有跨所有軸較小 sigma 的高斯 kernel 的標準差。標準差以序列的形式為每個軸給出,或以單個數字的形式給出,在這種情況下,該單個數字用作所有軸的標準差值。
- high_sigma純量或純量序列,可選 (預設為 None)
具有跨所有軸較大 sigma 的高斯 kernel 的標準差。標準差以序列的形式為每個軸給出,或以單個數字的形式給出,在這種情況下,該單個數字用作所有軸的標準差值。如果未提供 None (預設值),則所有軸的 sigma 計算為 1.6 * low_sigma。
- mode{‘reflect’, ‘constant’, ‘nearest’, ‘mirror’, ‘wrap’},可選
mode
參數決定如何處理陣列邊界,其中cval
是模式等於 'constant' 時的值。預設為 'nearest'。- cval純量,可選
如果
mode
為 ‘constant’,則用於填補輸入邊緣以外的值。預設值為 0.0- channel_axisint 或 None,可選
如果為 None,則假設影像為灰階(單通道)影像。否則,此參數指示陣列的哪個軸對應於通道。
在版本 0.19 中新增:
channel_axis
在 0.19 中新增。- truncate浮點數,可選(預設值為 4.0)
在此標準差個數處截斷濾波器。
- 傳回:
- filtered_imagendarray
過濾後的陣列。
注意事項
此函數將從使用 sigma 由
low_sigma
提供的高斯 kernel 過濾的陣列中,減去使用 sigma 由high_sigma
提供的高斯 kernel 過濾的陣列。high_sigma
的值必須始終大於或等於low_sigma
中對應的值,否則會引發ValueError
。當
high_sigma
為 None 時,high_sigma
的值將計算為low_sigma
中對應值的 1.6 倍。此比率最初由 Marr 和 Hildreth (1980) [1] 提出,並且通常用於近似高斯的反拉普拉斯算子,該算子用於邊緣和斑點偵測。輸入影像會根據
img_as_float
的慣例進行轉換。除了 sigma 值之外,所有參數都用於兩個濾波器。
參考資料
[1]Marr, D. and Hildreth, E. Theory of Edge Detection. Proc. R. Soc. Lond. Series B 207, 187-217 (1980). https://doi.org/10.1098/rspb.1980.0020
範例
對彩色影像套用簡單的高斯差分濾波器
>>> from skimage.data import astronaut >>> from skimage.filters import difference_of_gaussians >>> filtered_image = difference_of_gaussians(astronaut(), 2, 10, ... channel_axis=-1)
套用高斯拉普拉斯濾波器,該濾波器近似於高斯差分濾波器
>>> filtered_image = difference_of_gaussians(astronaut(), 2, ... channel_axis=-1)
使用每個軸的不同 sigma 值對灰階影像套用高斯差分濾波器
>>> from skimage.data import camera >>> filtered_image = difference_of_gaussians(camera(), (2,5), (3,20))
- skimage.filters.farid(image, mask=None, *, axis=None, mode='reflect', cval=0.0)[原始碼]#
使用 Farid 轉換找出邊緣強度。
- 參數:
- image陣列
輸入影像。
- mask布林值陣列,可選
將輸出影像剪輯到此遮罩。(mask=0 的值將設定為 0。)
- axisint 或 int 序列,可選
沿此軸計算邊緣濾波器。如果未提供,則會計算邊緣幅度。其定義為
farid_mag = np.sqrt(sum([farid(image, axis=i)**2 for i in range(image.ndim)]) / image.ndim)
如果 axis 是序列,也會計算幅度。
- modestr 或 str 序列,可選
捲積的邊界模式。有關模式的描述,請參閱
scipy.ndimage.convolve
。這可以是單個邊界模式或每個軸一個邊界模式。- cval浮點數,可選
當
mode
為'constant'
時,這是用於影像資料邊界外的值的常數。
- 傳回:
- output浮點數陣列
Farid 邊緣圖。
注意事項
取水平和垂直導數平方和的平方根,以獲得一個對方向不敏感的幅度值。與 Scharr 算子類似,此算子的設計具有旋轉不變性的約束。
參考資料
[1]Farid, H. 和 Simoncelli, E. P., “離散多維訊號的微分”, IEEE Transactions on Image Processing 13(4): 496-508, 2004. DOI:10.1109/TIP.2004.823819
[2]維基百科, “Farid and Simoncelli 導數”。網址:<https://en.wikipedia.org/wiki/Image_derivatives#Farid_and_Simoncelli_Derivatives>
範例
>>> from skimage import data >>> camera = data.camera() >>> from skimage import filters >>> edges = filters.farid(camera)
- skimage.filters.farid_h(image, *, mask=None)[原始碼]#
使用 Farid 轉換找出影像的水平邊緣。
- 參數:
- image二維陣列
要處理的影像。
- mask二維陣列,可選
一個可選的遮罩,用於限制應用到特定區域。請注意,遮罩區域周圍的像素也會被遮罩,以防止遮罩區域影響結果。
- 傳回:
- output二維陣列
Farid 邊緣圖。
注意事項
該核心是使用 [1] 中的 5 抽頭權重構建的。
參考資料
[1]Farid, H. 和 Simoncelli, E. P., “離散多維訊號的微分”, IEEE Transactions on Image Processing 13(4): 496-508, 2004. DOI:10.1109/TIP.2004.823819
[2]Farid, H. 和 Simoncelli, E. P. “最佳旋轉等變方向導數核心”,發表於:第七屆國際影像與模式電腦分析會議,基爾,德國。1997 年 9 月。
- skimage.filters.farid_v(image, *, mask=None)[原始碼]#
使用 Farid 轉換找出影像的垂直邊緣。
- 參數:
- image二維陣列
要處理的影像。
- mask二維陣列,可選
一個可選的遮罩,用於限制應用到特定區域。請注意,遮罩區域周圍的像素也會被遮罩,以防止遮罩區域影響結果。
- 傳回:
- output二維陣列
Farid 邊緣圖。
注意事項
該核心是使用 [1] 中的 5 抽頭權重構建的。
參考資料
[1]Farid, H. 和 Simoncelli, E. P., “離散多維訊號的微分”, IEEE Transactions on Image Processing 13(4): 496-508, 2004. DOI:10.1109/TIP.2004.823819
- skimage.filters.filter_forward(data, impulse_response=None, filter_params=None, predefined_filter=None)[原始碼]#
將給定的濾波器套用於資料。
- 參數:
- data(M, N) ndarray
輸入資料。
- impulse_response可呼叫
f(r, c, **filter_params)
濾波器的脈衝響應。請參閱 LPIFilter2D.__init__。
- filter_paramsdict,可選
脈衝響應函數的額外關鍵字參數。
- 其他參數:
- predefined_filterLPIFilter2D
如果您需要對不同的影像多次應用相同的濾波器,請建構 LPIFilter2D 並在此處指定。
範例
無標準化的高斯濾波器
>>> def filt_func(r, c, sigma=1): ... return np.exp(-(r**2 + c**2)/(2 * sigma**2)) >>> >>> from skimage import data >>> filtered = filter_forward(data.coins(), filt_func)
- skimage.filters.filter_inverse(data, impulse_response=None, filter_params=None, max_gain=2, predefined_filter=None)[原始碼]#
將濾波器反向套用於給定的資料。
- 參數:
- data(M, N) ndarray
輸入資料。
- impulse_response可呼叫
f(r, c, **filter_params)
濾波器的脈衝響應。請參閱
LPIFilter2D
。除非提供predifined_filter
,否則這是必要的參數。- filter_paramsdict,可選
脈衝響應函數的額外關鍵字參數。
- max_gain浮點數,可選
限制濾波器增益。通常,濾波器包含零,這會導致逆濾波器具有無限增益。高增益會放大偽影,因此建議使用保守的限制。
- 其他參數:
- predefined_filterLPIFilter2D,可選
如果您需要對不同的影像多次應用相同的濾波器,請建構 LPIFilter2D 並在此處指定。
- skimage.filters.frangi(image, sigmas=range(1, 10, 2), scale_range=None, scale_step=None, alpha=0.5, beta=0.5, gamma=None, black_ridges=True, mode='reflect', cval=0)[原始碼]#
使用 Frangi 血管濾波器過濾影像。
此濾波器可用於偵測連續的脊狀結構,例如血管、皺紋、河流。它可用於計算包含此類物件的整個影像的比例。
僅針對二維和三維影像定義。根據 [1] 中描述的方法,計算 Hessian 的特徵值,以計算影像區域與血管的相似度。
- 參數:
- image(M, N[, P]) ndarray
包含輸入影像資料的陣列。
- sigmas浮點數的可迭代物件,可選
用作濾波器縮放比例的 sigmas,即 np.arange(scale_range[0], scale_range[1], scale_step)
- scale_range浮點數的 2 元組,可選
使用的 sigmas 範圍。
- scale_step浮點數,可選
sigmas 之間的步長大小。
- alpha浮點數,可選
Frangi 校正常數,用於調整濾波器對偏離板狀結構的靈敏度。
- beta浮點數,可選
Frangi 校正常數,用於調整濾波器對偏離球狀結構的靈敏度。
- gamma浮點數,可選
Frangi 校正常數,用於調整濾波器對高變異數/紋理/結構區域的靈敏度。預設值 None 使用 Hessian 範數最大值的一半。
- black_ridges布林值,可選
當為 True(預設值)時,濾波器會偵測黑色脊狀結構;當為 False 時,它會偵測白色脊狀結構。
- mode{‘constant’、‘reflect’、‘wrap’、‘nearest’、‘mirror’},可選
如何處理影像邊界之外的值。
- cval浮點數,可選
與模式 'constant' 結合使用時,影像邊界之外的值。
- 傳回:
- out(M, N[, P]) ndarray
已濾波影像(所有尺度中像素的最大值)。
注意事項
此濾波器的早期版本由 Marc Schrijver(2001 年 11 月)、D. J. Kroon,特溫特大學(2009 年 5 月)[2] 和 D. G. Ellis(2017 年 1 月)[3] 實作。
參考資料
[1]Frangi, A. F., Niessen, W. J., Vincken, K. L., & Viergever, M. A. (1998,). 多尺度血管增強濾波。於國際醫學影像計算與電腦輔助介入會議 (頁 130-137)。Springer Berlin Heidelberg. DOI:10.1007/BFb0056195
[2]Kroon, D. J.: 基於 Hessian 的 Frangi 血管濾波器。
[3]Ellis, D. G.: ellisdg/frangi3d
- skimage.filters.gabor(image, frequency, theta=0, bandwidth=1, sigma_x=None, sigma_y=None, n_stds=3, offset=0, mode='reflect', cval=0)[原始碼]#
傳回 Gabor 濾波器的實部和虛部響應。
Gabor 濾波器核心的實部和虛部會應用於影像,並將響應以一對陣列的形式返回。
Gabor 濾波器是一種線性濾波器,具有高斯核心,並由正弦平面波調製。Gabor 濾波器的頻率和方向表示與人類視覺系統相似。Gabor 濾波器組常被用於電腦視覺和影像處理。它們特別適用於邊緣檢測和紋理分類。
- 參數:
- image二維陣列
輸入影像。
- frequencyfloat
諧波函數的空間頻率。以像素為單位指定。
- thetafloat,可選
以弧度為單位的方向。如果為 0,則諧波方向為 x 軸。
- bandwidthfloat,可選
濾波器捕獲的頻寬。對於固定的頻寬,
sigma_x
和sigma_y
會隨著頻率增加而減少。如果使用者設定了sigma_x
和sigma_y
,則此值會被忽略。- sigma_x, sigma_yfloat,可選
x 和 y 方向的標準差。這些方向適用於旋轉之前的核心。如果
theta = pi/2
,則核心會旋轉 90 度,因此sigma_x
控制垂直方向。- n_stds純量,可選
核心的線性大小為 n_stds(預設為 3)個標準差。
- offsetfloat,可選
諧波函數的相位偏移(以弧度為單位)。
- mode{‘constant’, ‘nearest’, ‘reflect’, ‘mirror’, ‘wrap’},可選
用來將影像與核心進行卷積的模式,會傳遞至
ndi.convolve
- cval純量,可選
如果卷積的
mode
為 'constant',則用來填充輸入邊緣之外的值。此參數會傳遞至ndi.convolve
。
- 傳回:
- real, imag陣列
使用 Gabor 濾波器核心的實部和虛部進行濾波的影像。影像與輸入影像具有相同的尺寸。
參考資料
範例
>>> from skimage.filters import gabor >>> from skimage import data >>> from matplotlib import pyplot as plt
>>> image = data.coins() >>> # detecting edges in a coin image >>> filt_real, filt_imag = gabor(image, frequency=0.6) >>> fix, ax = plt.subplots() >>> ax.imshow(filt_real) >>> plt.show()
>>> # less sensitivity to finer details with the lower frequency kernel >>> filt_real, filt_imag = gabor(image, frequency=0.1) >>> fig, ax = plt.subplots() >>> ax.imshow(filt_real) >>> plt.show()
- skimage.filters.gabor_kernel(frequency, theta=0, bandwidth=1, sigma_x=None, sigma_y=None, n_stds=3, offset=0, dtype=<class 'numpy.complex128'>)[原始碼]#
傳回複數 2D Gabor 濾波器核心。
Gabor 核心是一個由複數諧波函數調製的高斯核心。諧波函數由虛數正弦函數和實數餘弦函數組成。空間頻率與諧波波長和高斯核心的標準差成反比。頻寬也與標準差成反比。
- 參數:
- frequencyfloat
諧波函數的空間頻率。以像素為單位指定。
- thetafloat,可選
以弧度為單位的方向。如果為 0,則諧波方向為 x 軸。
- bandwidthfloat,可選
濾波器捕獲的頻寬。對於固定的頻寬,
sigma_x
和sigma_y
會隨著頻率增加而減少。如果使用者設定了sigma_x
和sigma_y
,則此值會被忽略。- sigma_x, sigma_yfloat,可選
x 和 y 方向的標準差。這些方向適用於旋轉之前的核心。如果
theta = pi/2
,則核心會旋轉 90 度,因此sigma_x
控制垂直方向。- n_stds純量,可選
核心的線性大小為 n_stds(預設為 3)個標準差
- offsetfloat,可選
諧波函數的相位偏移(以弧度為單位)。
- dtype{np.complex64, np.complex128}
指定濾波器是單精度還是雙精度複數。
- 傳回:
- g複數陣列
複數濾波器核心。
參考資料
範例
>>> from skimage.filters import gabor_kernel >>> from matplotlib import pyplot as plt
>>> gk = gabor_kernel(frequency=0.2) >>> fig, ax = plt.subplots() >>> ax.imshow(gk.real) >>> plt.show()
>>> # more ripples (equivalent to increasing the size of the >>> # Gaussian spread) >>> gk = gabor_kernel(frequency=0.2, bandwidth=0.1) >>> fig, ax = plt.suplots() >>> ax.imshow(gk.real) >>> plt.show()
- skimage.filters.gaussian(image, sigma=1, *, mode='nearest', cval=0, preserve_range=False, truncate=4.0, channel_axis=None, out=None)[原始碼]#
多維高斯濾波器。
- 參數:
- imagendarray
要篩選的輸入影像(灰階或彩色)。
- sigma純量或純量序列,可選
高斯核心的標準差。高斯濾波器的標準差會針對每個軸以序列或單一數字的方式給定,若是單一數字則表示所有軸都相同。
- mode{‘reflect’, ‘constant’, ‘nearest’, ‘mirror’, ‘wrap’},可選
mode
參數決定如何處理陣列邊界,其中cval
是模式等於 'constant' 時的值。預設為 'nearest'。- cval純量,可選
如果
mode
為 ‘constant’,則用於填補輸入邊緣以外的值。預設值為 0.0- preserve_rangebool,可選
如果為 True,則保留值的原始範圍。否則,會根據
img_as_float
的慣例轉換輸入image
(首先根據輸入的 dtype 正規化為值 [-1.0 ; 1.0] 或 [0 ; 1.0])。如需更多資訊,請參閱:https://scikit-image.dev.org.tw/docs/dev/user_guide/data_types.html
- truncatefloat,可選
在此標準差個數處截斷濾波器。
- channel_axisint 或 None,可選
如果為 None,則假設影像為灰階(單通道)影像。否則,此參數指示陣列的哪個軸對應於通道。
在 0.19 版中新增: 在 0.19 版中新增了
channel_axis
。- outndarray,可選
如果給定,則篩選後的影像會儲存在此陣列中。
在 0.23 版中新增: 在 0.23 版中新增了
out
。
- 傳回:
- filtered_imagendarray
已篩選的陣列
注意事項
此函式是
scipy.ndimage.gaussian_filter()
的包裝函式。整數陣列會轉換為浮點數。
out
應為浮點數資料類型,因為gaussian
會將輸入image
轉換為浮點數。如果未提供out
,則會配置另一個陣列並將其傳回作為結果。多維濾波器會實作為一維卷積濾波器的序列。中間陣列會以與輸出相同的資料類型儲存。因此,對於精度有限的輸出類型,結果可能不精確,因為中間結果可能以不夠精確的精度儲存。
範例
>>> import skimage as ski >>> a = np.zeros((3, 3)) >>> a[1, 1] = 1 >>> a array([[0., 0., 0.], [0., 1., 0.], [0., 0., 0.]]) >>> ski.filters.gaussian(a, sigma=0.4) # mild smoothing array([[0.00163116, 0.03712502, 0.00163116], [0.03712502, 0.84496158, 0.03712502], [0.00163116, 0.03712502, 0.00163116]]) >>> ski.filters.gaussian(a, sigma=1) # more smoothing array([[0.05855018, 0.09653293, 0.05855018], [0.09653293, 0.15915589, 0.09653293], [0.05855018, 0.09653293, 0.05855018]]) >>> # Several modes are possible for handling boundaries >>> ski.filters.gaussian(a, sigma=1, mode='reflect') array([[0.08767308, 0.12075024, 0.08767308], [0.12075024, 0.16630671, 0.12075024], [0.08767308, 0.12075024, 0.08767308]]) >>> # For RGB images, each is filtered separately >>> image = ski.data.astronaut() >>> filtered_img = ski.filters.gaussian(image, sigma=1, channel_axis=-1)
- skimage.filters.hessian(image, sigmas=range(1, 10, 2), scale_range=None, scale_step=None, alpha=0.5, beta=0.5, gamma=15, black_ridges=True, mode='reflect', cval=0)[原始碼]#
使用混合 Hessian 濾波器過濾影像。
此濾波器可用於偵測連續邊緣,例如血管、皺紋、河流。它可用於計算包含此類物件的整個影像的比例。
僅針對 2D 和 3D 影像定義。幾乎等於 Frangi 濾波器,但使用另一種平滑方法。請參閱 [1] 以了解 Frangi 和 Hessian 濾波器之間的差異。
- 參數:
- image(M, N[, P]) ndarray
包含輸入影像資料的陣列。
- sigmas浮點數的可迭代物件,可選
用作濾波器縮放比例的 sigmas,即 np.arange(scale_range[0], scale_range[1], scale_step)
- scale_range浮點數的 2 元組,可選
使用的 sigmas 範圍。
- scale_step浮點數,可選
sigmas 之間的步長大小。
- beta浮點數,可選
Frangi 校正常數,用於調整濾波器對偏離球狀結構的靈敏度。
- gamma浮點數,可選
Frangi 校正常數會調整濾波器對高變異數/紋理/結構區域的敏感度。
- black_ridges布林值,可選
當為 True(預設值)時,濾波器會偵測黑色脊狀結構;當為 False 時,它會偵測白色脊狀結構。
- mode{‘constant’、‘reflect’、‘wrap’、‘nearest’、‘mirror’},可選
如何處理影像邊界之外的值。
- cval浮點數,可選
與模式 'constant' 結合使用時,影像邊界之外的值。
- 傳回:
- out(M, N[, P]) ndarray
已濾波影像(所有尺度中像素的最大值)。
注意事項
由 Marc Schrijver 編寫(2001 年 11 月)由 D. J. Kroon 重新編寫(特溫特大學,2009 年 5 月)[2]
參考資料
[1]Ng, C. C., Yap, M. H., Costen, N., & Li, B. (2014,). Automatic wrinkle detection using hybrid Hessian filter. In Asian Conference on Computer Vision (pp. 609-622). Springer International Publishing. DOI:10.1007/978-3-319-16811-1_40
[2]Kroon, D. J.: 基於 Hessian 的 Frangi 血管濾波器。
- skimage.filters.laplace(image, ksize=3, mask=None)[原始碼]#
使用拉普拉斯算子找出影像的邊緣。
- 參數:
- imagendarray
要處理的影像。
- ksizeint,選填
定義離散拉普拉斯算子的大小,使其大小為 (ksize,) * image.ndim。
- maskndarray,選填
一個可選的遮罩,用於限制應用到特定區域。請注意,遮罩區域周圍的像素也會被遮罩,以防止遮罩區域影響結果。
- 傳回:
- outputndarray
拉普拉斯邊緣圖。
注意事項
拉普拉斯算子使用函式 skimage.restoration.uft.laplacian() 產生。
- skimage.filters.median(image, footprint=None, out=None, mode='nearest', cval=0.0, behavior='ndimage')[原始碼]#
傳回影像的局部中位數。
- 參數:
- image類陣列 (array-like)
輸入影像。
- footprintndarray,選填
如果
behavior=='rank'
,footprint
是由 1 和 0 組成的二維陣列。 如果behavior=='ndimage'
,footprint
是與image
具有相同維度的由 1 和 0 組成的 N 維陣列。 如果為 None,則footprint
將為每個維度具有 3 個元素的 N 維陣列 (例如,向量、正方形、立方體等)。- outndarray,(與 image 具有相同的 dtype),選填
如果為 None,則會分配一個新的陣列。
- mode{‘reflect’, ‘constant’, ‘nearest’, ‘mirror’,’‘wrap’},選填
mode 參數決定如何處理陣列邊界,其中
cval
是當 mode 等於 ‘constant’ 時的值。預設值為 ‘nearest’。在 0.15 版中新增: 當
behavior='ndimage'
時會使用mode
。- cval純量,可選
如果 mode 為 ‘constant’,則用於填充輸入邊緣外部的值。預設值為 0.0
在 0.15 版中新增:
cval
是在 0.15 版中加入的,當behavior='ndimage'
時會使用。- behavior{‘ndimage’, ‘rank’},選填
決定使用舊的行為 (即 < 0.15) 或新的行為。 舊的行為將會呼叫
skimage.filters.rank.median()
。新的行為將會呼叫scipy.ndimage.median_filter()
。預設值為 ‘ndimage’。在 0.15 版中新增:
behavior
是在 0.15 版中引入的在 0.16 版中變更: 預設的
behavior
已從 ‘rank’ 變更為 ‘ndimage’
- 傳回:
- out二維陣列 (與輸入影像具有相同的 dtype)
輸出影像。
另請參閱
skimage.filters.rank.median
中值濾波的基於秩的實作,提供更高的彈性以及額外的參數,但專用於無符號整數影像。
範例
>>> from skimage import data >>> from skimage.morphology import disk >>> from skimage.filters import median >>> img = data.camera() >>> med = median(img, disk(5))
- skimage.filters.meijering(image, sigmas=range(1, 10, 2), alpha=None, black_ridges=True, mode='reflect', cval=0)[原始碼]#
使用 Meijering 神經元濾波器過濾影像。
此濾波器可用於偵測連續的脊,例如神經突、皺紋、河流。它可用於計算包含此類物件的整個影像的比例。
計算 Hessian 的特徵值,根據 [1] 中描述的方法,計算影像區域與神經突的相似性。
- 參數:
- image(M, N[, …]) ndarray
包含輸入影像資料的陣列。
- sigmas浮點數的可迭代物件,可選
用作濾波器尺度的 Sigma 值
- alpha浮點數,可選
形狀濾波器常數,選擇最大平面拉長特徵。預設值 None 選擇最佳值 -1/(ndim+1)。
- black_ridges布林值,可選
當為 True(預設值)時,濾波器會偵測黑色脊狀結構;當為 False 時,它會偵測白色脊狀結構。
- mode{‘constant’、‘reflect’、‘wrap’、‘nearest’、‘mirror’},可選
如何處理影像邊界之外的值。
- cval浮點數,可選
與模式 'constant' 結合使用時,影像邊界之外的值。
- 傳回:
- out(M, N[, …]) ndarray
已濾波影像(所有尺度中像素的最大值)。
參考資料
[1]Meijering, E., Jacob, M., Sarria, J. C., Steiner, P., Hirling, H., Unser, M. (2004). Design and validation of a tool for neurite tracing and analysis in fluorescence microscopy images. Cytometry Part A, 58(2), 167-176. DOI:10.1002/cyto.a.20022
- skimage.filters.prewitt(image, mask=None, *, axis=None, mode='reflect', cval=0.0)[原始碼]#
使用 Prewitt 轉換找出邊緣強度。
- 參數:
- image陣列
輸入影像。
- mask布林值陣列,可選
將輸出影像剪輯到此遮罩。(mask=0 的值將設定為 0。)
- axisint 或 int 序列,可選
沿此軸計算邊緣濾波器。如果未提供,則會計算邊緣幅度。其定義為
prw_mag = np.sqrt(sum([prewitt(image, axis=i)**2 for i in range(image.ndim)]) / image.ndim)
如果 axis 是序列,也會計算幅度。
- modestr 或 str 序列,可選
捲積的邊界模式。有關模式的描述,請參閱
scipy.ndimage.convolve
。這可以是單個邊界模式或每個軸一個邊界模式。- cval浮點數,可選
當
mode
為'constant'
時,這是用於影像資料邊界外的值的常數。
- 傳回:
- output浮點數陣列
Prewitt 邊緣圖。
注意事項
邊緣強度會稍微依賴邊緣方向,因為 Prewitt 算子對梯度算子的近似並非完全旋轉不變。為了獲得更好的旋轉不變性,應使用 Scharr 算子。Sobel 算子具有比 Prewitt 算子更好的旋轉不變性,但比 Scharr 算子差。
範例
>>> from skimage import data >>> from skimage import filters >>> camera = data.camera() >>> edges = filters.prewitt(camera)
- skimage.filters.prewitt_h(image, mask=None)[原始碼]#
使用 Prewitt 轉換找出影像的水平邊緣。
- 參數:
- image二維陣列
要處理的影像。
- mask二維陣列,可選
一個可選的遮罩,用於限制應用到特定區域。請注意,遮罩區域周圍的像素也會被遮罩,以防止遮罩區域影響結果。
- 傳回:
- output二維陣列
Prewitt 邊緣圖。
注意事項
我們使用以下核心 (kernel)
1/3 1/3 1/3 0 0 0 -1/3 -1/3 -1/3
- skimage.filters.prewitt_v(image, mask=None)[原始碼]#
使用 Prewitt 轉換找出影像的垂直邊緣。
- 參數:
- image二維陣列
要處理的影像。
- mask二維陣列,可選
一個可選的遮罩,用於限制應用到特定區域。請注意,遮罩區域周圍的像素也會被遮罩,以防止遮罩區域影響結果。
- 傳回:
- output二維陣列
Prewitt 邊緣圖。
注意事項
我們使用以下核心 (kernel)
1/3 0 -1/3 1/3 0 -1/3 1/3 0 -1/3
- skimage.filters.rank_order(image)[原始碼]#
傳回形狀相同的影像,其中每個像素都是
image
的唯一值以升序排列時,該像素值在其中的索引,也稱為排序值。- 參數:
- imagendarray
- 傳回:
- labels無符號整數的 ndarray,形狀為 image.shape
新的陣列,其中每個像素都具有
image
中對應像素的秩序值。像素值介於 0 到 n - 1 之間,其中 n 是image
中不同唯一值的數量。此陣列的 dtype 將由np.min_scalar_type(image.size)
決定。- original_values一維 ndarray
image
的唯一原始值。這將具有與image
相同的 dtype。
範例
>>> a = np.array([[1, 4, 5], [4, 4, 1], [5, 1, 1]]) >>> a array([[1, 4, 5], [4, 4, 1], [5, 1, 1]]) >>> rank_order(a) (array([[0, 1, 2], [1, 1, 0], [2, 0, 0]], dtype=uint8), array([1, 4, 5])) >>> b = np.array([-1., 2.5, 3.1, 2.5]) >>> rank_order(b) (array([0, 1, 2, 1], dtype=uint8), array([-1. , 2.5, 3.1]))
- skimage.filters.roberts(image, mask=None)[原始碼]#
使用羅伯茲交叉算子尋找邊緣強度。
- 參數:
- image二維陣列
要處理的影像。
- mask二維陣列,可選
一個可選的遮罩,用於限制應用到特定區域。請注意,遮罩區域周圍的像素也會被遮罩,以防止遮罩區域影響結果。
- 傳回:
- output二維陣列
羅伯茲交叉邊緣圖。
範例
>>> from skimage import data >>> camera = data.camera() >>> from skimage import filters >>> edges = filters.roberts(camera)
- skimage.filters.roberts_neg_diag(image, mask=None)[原始碼]#
使用羅伯茲交叉算子尋找影像的交叉邊緣。
將核心應用於輸入影像,以產生一個方向的梯度分量的單獨測量值。
- 參數:
- image二維陣列
要處理的影像。
- mask二維陣列,可選
一個可選的遮罩,用於限制應用到特定區域。請注意,遮罩區域周圍的像素也會被遮罩,以防止遮罩區域影響結果。
- 傳回:
- output二維陣列
羅伯茲邊緣圖。
注意事項
我們使用以下核心 (kernel)
0 1 -1 0
- skimage.filters.roberts_pos_diag(image, mask=None)[原始碼]#
使用羅伯茲交叉算子尋找影像的交叉邊緣。
將核心應用於輸入影像,以產生一個方向的梯度分量的單獨測量值。
- 參數:
- image二維陣列
要處理的影像。
- mask二維陣列,可選
一個可選的遮罩,用於限制應用到特定區域。請注意,遮罩區域周圍的像素也會被遮罩,以防止遮罩區域影響結果。
- 傳回:
- output二維陣列
羅伯茲邊緣圖。
注意事項
我們使用以下核心 (kernel)
1 0 0 -1
- skimage.filters.sato(image, sigmas=range(1, 10, 2), black_ridges=True, mode='reflect', cval=0)[原始碼]#
使用 Sato 管狀濾波器過濾影像。
此濾波器可用於檢測連續的脊,例如管狀結構、皺紋、河流。它可以計算包含此類物件的整個影像的比例。
僅針對 2-D 和 3-D 影像定義。根據 [1] 中描述的方法,計算 Hessian 的特徵值,以計算影像區域與管狀結構的相似性。
- 參數:
- image(M, N[, P]) ndarray
包含輸入影像資料的陣列。
- sigmas浮點數的可迭代物件,可選
用作濾波器尺度的 Sigmas。
- black_ridges布林值,可選
當為 True(預設值)時,濾波器會偵測黑色脊狀結構;當為 False 時,它會偵測白色脊狀結構。
- mode{‘constant’、‘reflect’、‘wrap’、‘nearest’、‘mirror’},可選
如何處理影像邊界之外的值。
- cval浮點數,可選
與模式 'constant' 結合使用時,影像邊界之外的值。
- 傳回:
- out(M, N[, P]) ndarray
已濾波影像(所有尺度中像素的最大值)。
參考資料
[1]Sato, Y., Nakajima, S., Shiraga, N., Atsumi, H., Yoshida, S., Koller, T., …, Kikinis, R. (1998). Three-dimensional multi-scale line filter for segmentation and visualization of curvilinear structures in medical images. Medical image analysis, 2(2), 143-168. DOI:10.1016/S1361-8415(98)80009-1
- skimage.filters.scharr(image, mask=None, *, axis=None, mode='reflect', cval=0.0)[原始碼]#
使用 Scharr 轉換找出邊緣強度。
- 參數:
- image陣列
輸入影像。
- mask布林值陣列,可選
將輸出影像剪輯到此遮罩。(mask=0 的值將設定為 0。)
- axisint 或 int 序列,可選
沿此軸計算邊緣濾波器。如果未提供,則會計算邊緣幅度。其定義為
sch_mag = np.sqrt(sum([scharr(image, axis=i)**2 for i in range(image.ndim)]) / image.ndim)
如果 axis 是序列,也會計算幅度。
- modestr 或 str 序列,可選
捲積的邊界模式。有關模式的描述,請參閱
scipy.ndimage.convolve
。這可以是單個邊界模式或每個軸一個邊界模式。- cval浮點數,可選
當
mode
為'constant'
時,這是用於影像資料邊界外的值的常數。
- 傳回:
- output浮點數陣列
夏爾邊緣圖。
注意事項
Scharr 算子比其他邊緣濾波器(如 Sobel 或 Prewitt 算子)具有更好的旋轉不變性。
參考資料
[1]D. Kroon, 2009, Short Paper University Twente, Numerical Optimization of Kernel Based Image Derivatives.
範例
>>> from skimage import data >>> from skimage import filters >>> camera = data.camera() >>> edges = filters.scharr(camera)
- skimage.filters.scharr_h(image, mask=None)[原始碼]#
使用 Scharr 轉換找出影像的水平邊緣。
- 參數:
- image二維陣列
要處理的影像。
- mask二維陣列,可選
一個可選的遮罩,用於限制應用到特定區域。請注意,遮罩區域周圍的像素也會被遮罩,以防止遮罩區域影響結果。
- 傳回:
- output二維陣列
夏爾邊緣圖。
注意事項
我們使用以下核心 (kernel)
3 10 3 0 0 0 -3 -10 -3
參考資料
[1]D. Kroon, 2009, Short Paper University Twente, Numerical Optimization of Kernel Based Image Derivatives.
- skimage.filters.scharr_v(image, mask=None)[原始碼]#
使用 Scharr 轉換找出影像的垂直邊緣。
- 參數:
- image二維陣列
要處理的影像
- mask二維陣列,可選
一個可選的遮罩,用於限制應用到特定區域。請注意,遮罩區域周圍的像素也會被遮罩,以防止遮罩區域影響結果。
- 傳回:
- output二維陣列
夏爾邊緣圖。
注意事項
我們使用以下核心 (kernel)
3 0 -3 10 0 -10 3 0 -3
參考資料
[1]D. Kroon, 2009, Short Paper University Twente, Numerical Optimization of Kernel Based Image Derivatives.
- skimage.filters.sobel(image, mask=None, *, axis=None, mode='reflect', cval=0.0)[原始碼]#
使用 Sobel 濾波器找出影像中的邊緣。
- 參數:
- image陣列
輸入影像。
- mask布林值陣列,可選
將輸出影像剪輯到此遮罩。(mask=0 的值將設定為 0。)
- axisint 或 int 序列,可選
沿此軸計算邊緣濾波器。如果未提供,則會計算邊緣幅度。其定義為
sobel_mag = np.sqrt(sum([sobel(image, axis=i)**2 for i in range(image.ndim)]) / image.ndim)
如果 axis 是序列,也會計算幅度。
- modestr 或 str 序列,可選
捲積的邊界模式。有關模式的描述,請參閱
scipy.ndimage.convolve
。這可以是單個邊界模式或每個軸一個邊界模式。- cval浮點數,可選
當
mode
為'constant'
時,這是用於影像資料邊界外的值的常數。
- 傳回:
- output浮點數陣列
索貝爾邊緣圖。
參考資料
[1]D. Kroon, 2009, Short Paper University Twente, Numerical Optimization of Kernel Based Image Derivatives.
範例
>>> from skimage import data >>> from skimage import filters >>> camera = data.camera() >>> edges = filters.sobel(camera)
- skimage.filters.sobel_h(image, mask=None)[原始碼]#
使用 Sobel 轉換找出影像的水平邊緣。
- 參數:
- image二維陣列
要處理的影像。
- mask二維陣列,可選
一個可選的遮罩,用於限制應用到特定區域。請注意,遮罩區域周圍的像素也會被遮罩,以防止遮罩區域影響結果。
- 傳回:
- output二維陣列
索貝爾邊緣圖。
注意事項
我們使用以下核心 (kernel)
1 2 1 0 0 0 -1 -2 -1
- skimage.filters.sobel_v(image, mask=None)[原始碼]#
使用 Sobel 轉換找出影像的垂直邊緣。
- 參數:
- image二維陣列
要處理的影像。
- mask二維陣列,可選
一個可選的遮罩,用於限制應用到特定區域。請注意,遮罩區域周圍的像素也會被遮罩,以防止遮罩區域影響結果。
- 傳回:
- output二維陣列
索貝爾邊緣圖。
注意事項
我們使用以下核心 (kernel)
1 0 -1 2 0 -2 1 0 -1
- skimage.filters.threshold_isodata(image=None, nbins=256, return_all=False, *, hist=None)[原始碼]#
傳回基於 ISODATA 方法的閾值。
基於直方圖的閾值,稱為 Ridler-Calvard 方法或中間均值。傳回的閾值滿足以下等式
threshold = (image[image <= threshold].mean() + image[image > threshold].mean()) / 2.0
也就是說,傳回的閾值是將影像分成兩組像素的強度,其中閾值強度位於這些組的平均強度之間的中間。
對於整數影像,上述等式在一個單位內成立;對於浮點影像,等式在直方圖箱寬內成立。
必須提供影像或 hist。如果提供 hist,則會忽略影像的實際直方圖。
- 參數:
- image(M, N[, …]) ndarray
灰階輸入影像。
- nbinsint,可選
用於計算直方圖的 bin 數量。對於整數陣列,此值會被忽略。
- return_allbool,可選
如果為 False (預設值),則僅傳回滿足上述等式的最低閾值。如果為 True,則傳回所有有效的閾值。
- hist陣列,或陣列的 2 個元組,可選
用於確定閾值的直方圖和相應的 bin 中心強度陣列。或者,只能傳遞直方圖。
- 傳回:
- threshold浮點數或整數或陣列
閾值。
參考資料
[1]Ridler, TW & Calvard, S (1978), “Picture thresholding using an iterative selection method” IEEE Transactions on Systems, Man and Cybernetics 8: 630-632, DOI:10.1109/TSMC.1978.4310039
[2]Sezgin M. 和 Sankur B. (2004) “影像閾值技術與定量效能評估綜述”《電子影像期刊》,13(1): 146-165,http://www.busim.ee.boun.edu.tr/~sankur/SankurFolder/Threshold_survey.pdf DOI:10.1117/1.1631315
[3]ImageJ 自動閾值程式碼,http://fiji.sc/wiki/index.php/Auto_Threshold
範例
>>> from skimage.data import coins >>> image = coins() >>> thresh = threshold_isodata(image) >>> binary = image > thresh
- skimage.filters.threshold_li(image, *, tolerance=None, initial_guess=None, iter_callback=None)[原始碼]#
透過李氏迭代最小交叉熵方法計算閾值。
- 參數:
- image(M, N[, …]) ndarray
灰階輸入影像。
- tolerance浮點數,選填
當迭代中閾值的變化小於此值時,完成計算。預設情況下,這是
image
中強度值之間最小差異的一半。- initial_guess浮點數或可呼叫物件 (Callable[[array[float]], float]),選填
李氏迭代方法使用梯度下降來尋找最佳閾值。如果影像強度直方圖包含兩個以上的模態(峰值),則梯度下降可能會陷入局部最佳解。迭代的初始猜測可以幫助演算法找到全域最佳閾值。浮點數值定義了一個特定的起點,而可呼叫物件應接收影像強度的陣列並回傳浮點數值。有效的可呼叫物件範例包括
numpy.mean
(預設值)、lambda arr: numpy.quantile(arr, 0.95)
,甚至是skimage.filters.threshold_otsu()
。- iter_callback可呼叫物件 (Callable[[float], Any]),選填
在演算法的每次迭代中,都會對閾值呼叫的函式。
- 傳回:
- threshold浮點數
上限閾值。所有強度高於此值的像素都被視為前景。
參考資料
[1]Li C.H. 和 Lee C.K. (1993) “最小交叉熵閾值化”《模式辨識》,26(4): 617-625 DOI:10.1016/0031-3203(93)90115-D
[2]Li C.H. 和 Tam P.K.S. (1998) “最小交叉熵閾值化的迭代演算法”《模式辨識快報》,18(8): 771-776 DOI:10.1016/S0167-8655(98)00057-9
[3]Sezgin M. 和 Sankur B. (2004) “影像閾值技術與定量效能評估綜述”《電子影像期刊》,13(1): 146-165 DOI:10.1117/1.1631315
[4]ImageJ 自動閾值程式碼,http://fiji.sc/wiki/index.php/Auto_Threshold
範例
>>> from skimage.data import camera >>> image = camera() >>> thresh = threshold_li(image) >>> binary = image > thresh
- skimage.filters.threshold_local(image, block_size=3, method='gaussian', offset=0, mode='reflect', param=None, cval=0)[原始碼]#
根據局部像素鄰域計算閾值遮罩影像。
也稱為自適應或動態閾值化。閾值是像素局部鄰域的加權平均值減去一個常數。或者,可以使用 'generic' 方法透過給定的函式動態確定閾值。
- 參數:
- image(M, N[, …]) ndarray
灰階輸入影像。
- block_size整數或整數序列
用於計算閾值的像素鄰域的奇數大小(例如:3、5、7、…、21、…)。
- method{‘generic’, ‘gaussian’, ‘mean’, ‘median’},選填
用於在加權平均影像中確定局部鄰域的自適應閾值的方法。
‘generic’:使用自訂函式(請參閱
param
參數)‘gaussian’:套用高斯濾波器(請參閱
param
參數以取得自訂 sigma 值)‘mean’:套用算術平均濾波器
‘median’:套用中值排序濾波器
預設情況下,使用 ‘gaussian’ 方法。
- offsetfloat,可選
從鄰域的加權平均值中減去的常數,以計算局部閾值。預設偏移量為 0。
- mode{‘reflect’, ‘constant’, ‘nearest’, ‘mirror’, ‘wrap’},可選
mode 參數決定如何處理陣列邊界,其中 cval 是 mode 等於 'constant' 時的值。預設值為 'reflect'。
- param{整數、函式},選填
指定 ‘gaussian’ 方法的 sigma 或 ‘generic’ 方法的函式物件。此函式將局部鄰域的扁平陣列作為單一引數,並回傳中心像素的計算閾值。
- cval浮點數,可選
如果 mode 為 ‘constant’,則填入輸入邊緣的值。
- 傳回:
- threshold(M, N[, …]) ndarray
閾值影像。輸入影像中所有高於閾值影像中對應像素的像素都被視為前景。
參考資料
[1]Gonzalez, R. C. 和 Wood, R. E. “數位影像處理(第二版)。”Prentice-Hall Inc., 2002: 600–612。ISBN: 0-201-18075-8
範例
>>> from skimage.data import camera >>> image = camera()[:50, :50] >>> binary_image1 = image > threshold_local(image, 15, 'mean') >>> func = lambda arr: arr.mean() >>> binary_image2 = image > threshold_local(image, 15, 'generic', ... param=func)
- skimage.filters.threshold_mean(image)[原始碼]#
傳回基於灰度值平均值的閾值。
- 參數:
- image(M, N[, …]) ndarray
灰階輸入影像。
- 傳回:
- threshold浮點數
上限閾值。所有強度高於此值的像素都被視為前景。
參考資料
[1]C. A. Glasbey, “直方圖式閾值化演算法分析,”CVGIP: 圖形模型與影像處理,第 55 卷,第 532-537 頁,1993 年。DOI:10.1006/cgip.1993.1040
範例
>>> from skimage.data import camera >>> image = camera() >>> thresh = threshold_mean(image) >>> binary = image > thresh
- skimage.filters.threshold_minimum(image=None, nbins=256, max_num_iter=10000, *, hist=None)[原始碼]#
傳回基於最小值方法的閾值。
如果未提供,則會計算輸入
image
的直方圖,並進行平滑處理,直到只有兩個最大值。然後,兩者之間的最小值是閾值。必須提供影像或 hist。如果提供 hist,則會忽略影像的實際直方圖。
- 參數:
- image(M, N[, …]) ndarray,選填
灰階輸入影像。
- nbinsint,可選
用於計算直方圖的 bin 數量。對於整數陣列,此值會被忽略。
- max_num_iter整數,選填
平滑直方圖的最大迭代次數。
- hist陣列,或陣列的 2 個元組,可選
用於確定閾值的直方圖和相應的 bin 中心強度陣列。或者,只能傳遞直方圖。
- 傳回:
- threshold浮點數
上限閾值。所有強度高於此值的像素都被視為前景。
- 引發:
- RuntimeError
如果無法在直方圖中找到兩個局部最大值,或平滑處理的迭代次數超過 1e4 次。
參考資料
[1]C. A. Glasbey, “直方圖式閾值化演算法分析,”CVGIP: 圖形模型與影像處理,第 55 卷,第 532-537 頁,1993 年。
[2]Prewitt, JMS & Mendelsohn, ML (1966), “細胞影像分析”,《紐約科學院年報》128: 1035-1053 DOI:10.1111/j.1749-6632.1965.tb11715.x
範例
>>> from skimage.data import camera >>> image = camera() >>> thresh = threshold_minimum(image) >>> binary = image > thresh
- skimage.filters.threshold_multiotsu(image=None, classes=3, nbins=256, *, hist=None)[原始碼]#
產生
classes
-1 個閾值,以根據 Otsu 的多類別方法劃分image
中的灰階。選擇閾值以最大化閾值灰階類別之間成對變異數的總和。如需更多詳細資訊,請參閱註解和 [1]。
必須提供影像或 hist。如果提供 hist,則會忽略影像的實際直方圖。
- 參數:
- image(M, N[, …]) ndarray,選填
灰階輸入影像。
- classes整數,選填
要閾值的類別數,即產生的區域數。
- nbinsint,可選
用於計算直方圖的 bin 數。此值會被整數陣列忽略。
- hist陣列,或陣列的 2 個元組,可選
從中確定閾值的直方圖,以及選擇性的 bin 中心強度對應陣列。如果未提供 hist,此函式將會從影像中計算它(請參閱註解)。
- 傳回:
- thresh陣列
包含所需類別閾值的陣列。
- 引發:
- ValueError
如果
image
包含的灰階值少於所需的類別數。
注意事項
此實作依賴於 Cython 函式,其複雜度為 \(O\left(\frac{Ch^{C-1}}{(C-1)!}\right)\),其中 \(h\) 是直方圖 bin 的數量,而 \(C\) 是所需的類別數。
如果未提供直方圖 (hist),此函數將使用
skimage.exposure.histogram
,其行為與np.histogram
不同。雖然兩者都允許,但為了行為一致,請使用前者。輸入影像必須為灰階影像。
參考資料
[1]Liao, P-S., Chen, T-S. 和 Chung, P-C., “A fast algorithm for multilevel thresholding”, Journal of Information Science and Engineering 17 (5): 713-727, 2001. 可於以下網址取得:<https://ftp.iis.sinica.edu.tw/JISE/2001/200109_01.pdf> DOI:10.6688/JISE.2001.17.5.1
[2]Tosa, Y., “Multi-Otsu Threshold”, ImageJ 的 Java 外掛程式。可於以下網址取得:<http://imagej.net/plugins/download/Multi_OtsuThreshold.java>
範例
>>> from skimage.color import label2rgb >>> from skimage import data >>> image = data.camera() >>> thresholds = threshold_multiotsu(image) >>> regions = np.digitize(image, bins=thresholds) >>> regions_colorized = label2rgb(regions)
- skimage.filters.threshold_niblack(image, window_size=15, k=0.2)[原始碼]#
將 Niblack 局部閾值套用於陣列。
使用以下公式計算影像中每個像素的閾值 T
T = m(x,y) - k * s(x,y)
其中 m(x,y) 和 s(x,y) 是像素 (x,y) 周圍由大小為 w 乘以 w 的矩形視窗定義的鄰域的平均值和標準差。k 是可配置的參數,會加權標準差的影響。
- 參數:
- image(M, N[, …]) ndarray
灰階輸入影像。
- window_sizeint,或 int 的可迭代物件,選用
視窗大小指定為單一奇數整數 (3, 5, 7, …),或長度為
image.ndim
且僅包含奇數整數的可迭代物件(例如(1, 5, 5)
)。- kfloat,選用
閾值公式中參數 k 的值。
- 傳回:
- threshold(M, N[, …]) ndarray
閾值遮罩。所有強度高於此值的像素都假設為前景。
注意事項
此演算法最初設計用於文字辨識。
Bradley 閾值是 Niblack 閾值的特例,等同於
>>> from skimage import data >>> image = data.page() >>> q = 1 >>> threshold_image = threshold_niblack(image, k=0) * q
對於某些值
q
。預設情況下,Bradley 和 Roth 使用q=1
。參考資料
[1]W. Niblack, An introduction to Digital Image Processing, Prentice-Hall, 1986.
[2]D. Bradley 和 G. Roth, “Adaptive thresholding using Integral Image”, Journal of Graphics Tools 12(2), pp. 13-21, 2007. DOI:10.1080/2151237X.2007.10129236
範例
>>> from skimage import data >>> image = data.page() >>> threshold_image = threshold_niblack(image, window_size=7, k=0.1)
- skimage.filters.threshold_otsu(image=None, nbins=256, *, hist=None)[原始碼]#
根據 Otsu 方法傳回閾值。
必須提供影像或 hist。如果提供 hist,則會忽略影像的實際直方圖。
- 參數:
- image(M, N[, …]) ndarray,選填
灰階輸入影像。
- nbinsint,可選
用於計算直方圖的 bin 數量。對於整數陣列,此值會被忽略。
- hist陣列,或陣列的 2 個元組,可選
用於決定閾值的直方圖,以及可選的對應的 bin 中心強度陣列。如果沒有提供直方圖,此函數將從影像計算直方圖。
- 傳回:
- threshold浮點數
上限閾值。所有強度高於此值的像素都被視為前景。
注意事項
輸入影像必須為灰階影像。
參考資料
範例
>>> from skimage.data import camera >>> image = camera() >>> thresh = threshold_otsu(image) >>> binary = image <= thresh
- skimage.filters.threshold_sauvola(image, window_size=15, k=0.2, r=None)[原始碼]#
將 Sauvola 局部閾值套用至陣列。Sauvola 是 Niblack 技術的修改版本。
在原始方法中,使用以下公式計算影像中每個像素的閾值 T
T = m(x,y) * (1 + k * ((s(x,y) / R) - 1))
其中 m(x,y) 和 s(x,y) 是像素 (x,y) 周圍由大小為 w 乘以 w 的矩形視窗定義的鄰域的平均值和標準差。k 是可配置的參數,會加權標準差的影響。R 是灰階影像的最大標準差。
- 參數:
- image(M, N[, …]) ndarray
灰階輸入影像。
- window_sizeint,或 int 的可迭代物件,選用
視窗大小指定為單一奇數整數 (3, 5, 7, …),或長度為
image.ndim
且僅包含奇數整數的可迭代物件(例如(1, 5, 5)
)。- kfloat,選用
正參數 k 的值。
- rfloat,選用
R 的值,標準差的動態範圍。如果為 None,則設定為影像 dtype 範圍的一半。
- 傳回:
- threshold(M, N[, …]) ndarray
閾值遮罩。所有強度高於此值的像素都假設為前景。
注意事項
此演算法最初設計用於文字辨識。
參考資料
[1]J. Sauvola 和 M. Pietikainen, “Adaptive document image binarization,” Pattern Recognition 33(2), pp. 225-236, 2000. DOI:10.1016/S0031-3203(99)00055-2
範例
>>> from skimage import data >>> image = data.page() >>> t_sauvola = threshold_sauvola(image, window_size=15, k=0.2) >>> binary_image = image > t_sauvola
- skimage.filters.threshold_triangle(image, nbins=256)[原始碼]#
傳回基於三角形演算法的閾值。
- 參數:
- image(M, N[, …]) ndarray
灰階輸入影像。
- nbinsint,可選
用於計算直方圖的 bin 數量。對於整數陣列,此值會被忽略。
- 傳回:
- threshold浮點數
上限閾值。所有強度高於此值的像素都被視為前景。
參考資料
[1]Zack, G. W., Rogers, W. E. 和 Latt, S. A., 1977, Automatic Measurement of Sister Chromatid Exchange Frequency, Journal of Histochemistry and Cytochemistry 25 (7), pp. 741-753 DOI:10.1177/25.7.70454
[2]ImageJ 自動閾值程式碼,http://fiji.sc/wiki/index.php/Auto_Threshold
範例
>>> from skimage.data import camera >>> image = camera() >>> thresh = threshold_triangle(image) >>> binary = image > thresh
- skimage.filters.threshold_yen(image=None, nbins=256, *, hist=None)[原始碼]#
根據 Yen 方法傳回閾值。必須提供影像或直方圖。如果提供直方圖,則會忽略影像的實際直方圖。
- 參數:
- image(M, N[, …]) ndarray
灰階輸入影像。
- nbinsint,可選
用於計算直方圖的 bin 數量。對於整數陣列,此值會被忽略。
- hist陣列,或陣列的 2 個元組,可選
用於決定閾值的直方圖,以及可選的對應的 bin 中心強度陣列。此函數的另一個用途是僅傳遞直方圖。
- 傳回:
- threshold浮點數
上限閾值。所有強度高於此值的像素都被視為前景。
參考資料
[1]Yen J.C., Chang F.J., 和 Chang S. (1995) “A New Criterion for Automatic Multilevel Thresholding” IEEE Trans. on Image Processing, 4(3): 370-378. DOI:10.1109/83.366472
[2]Sezgin M. 和 Sankur B. (2004) “Survey over Image Thresholding Techniques and Quantitative Performance Evaluation” Journal of Electronic Imaging, 13(1): 146-165, DOI:10.1117/1.1631315 http://www.busim.ee.boun.edu.tr/~sankur/SankurFolder/Threshold_survey.pdf
[3]ImageJ 自動閾值程式碼,http://fiji.sc/wiki/index.php/Auto_Threshold
範例
>>> from skimage.data import camera >>> image = camera() >>> thresh = threshold_yen(image) >>> binary = image <= thresh
- skimage.filters.try_all_threshold(image, figsize=(8, 5), verbose=True)[原始碼]#
傳回比較不同閾值處理方法輸出的圖形。
- 參數:
- image(M, N) ndarray
輸入影像。
- figsizetuple,選用
圖形大小(以英吋為單位)。
- verbosebool,選用
針對每個方法列印函數名稱。
- 傳回:
- fig, axtuple
Matplotlib 圖形和軸。
注意事項
使用下列演算法
isodata
li
mean
minimum
otsu
triangle
yen
範例
>>> from skimage.data import text >>> fig, ax = try_all_threshold(text(), figsize=(10, 6), verbose=False)
- skimage.filters.unsharp_mask(image, radius=1.0, amount=1.0, preserve_range=False, *, channel_axis=None)[原始碼]#
非銳化遮罩濾波器。
銳利細節被識別為原始影像與其模糊版本之間的差異。然後會縮放這些細節,並加回原始影像。
- 參數:
- image(M[, …][, C]) ndarray
輸入影像。
- radius純量或純量序列,選用
如果提供純量,則其值會用於所有維度。如果提供序列,則除了多通道影像的最後一個維度之外,每個維度都必須有一個半徑。請注意,半徑 0 表示不模糊,且不允許負值。
- amount純量,選用
細節將使用此因子放大。該因子可以是 0 或負數。通常,它是個小的正數,例如 1.0。
- preserve_rangebool,可選
是否保留原始值範圍。否則,會根據
img_as_float
的慣例轉換輸入影像。另請參閱 https://scikit-image.dev.org.tw/docs/dev/user_guide/data_types.html- channel_axisint 或 None,可選
如果為 None,則假設影像為灰階(單通道)影像。否則,此參數指示陣列的哪個軸對應於通道。
在版本 0.19 中新增:
channel_axis
在 0.19 中新增。
- 傳回:
- output(M[, …][, C]) float 的 ndarray
套用非銳化遮罩的影像。
注意事項
非銳化遮罩是一種影像銳化技術。它是一種線性影像運算,且數值穩定,這與不適定問題的反摺積不同。由於這種穩定性,它通常比反摺積更受青睞。
主要概念如下:銳利細節被識別為原始影像與其模糊版本之間的差異。在縮放步驟後,這些細節會加回原始影像
增強影像 = 原始影像 + amount * (原始影像 - 模糊影像)
當將此濾鏡獨立應用於數個色彩圖層時,可能會發生色彩溢色(color bleeding)現象。若僅處理適當色彩空間(例如 HSV、HSL、YUV 或 YCbCr)中的亮度/明度/強度通道,則可獲得更視覺上令人愉悅的結果。
在大多數數位影像處理入門書籍中都有描述非銳化遮罩(Unsharp masking)。此實作基於 [1]。
參考資料
[1]Maria Petrou, Costas Petrou “Image Processing: The Fundamentals”, (2010), ed ii., page 357, ISBN 13: 9781119994398 DOI:10.1002/9781119994398
[2]範例
>>> array = np.ones(shape=(5,5), dtype=np.uint8)*100 >>> array[2,2] = 120 >>> array array([[100, 100, 100, 100, 100], [100, 100, 100, 100, 100], [100, 100, 120, 100, 100], [100, 100, 100, 100, 100], [100, 100, 100, 100, 100]], dtype=uint8) >>> np.around(unsharp_mask(array, radius=0.5, amount=2),2) array([[0.39, 0.39, 0.39, 0.39, 0.39], [0.39, 0.39, 0.38, 0.39, 0.39], [0.39, 0.38, 0.53, 0.38, 0.39], [0.39, 0.39, 0.38, 0.39, 0.39], [0.39, 0.39, 0.39, 0.39, 0.39]])
>>> array = np.ones(shape=(5,5), dtype=np.int8)*100 >>> array[2,2] = 127 >>> np.around(unsharp_mask(array, radius=0.5, amount=2),2) array([[0.79, 0.79, 0.79, 0.79, 0.79], [0.79, 0.78, 0.75, 0.78, 0.79], [0.79, 0.75, 1. , 0.75, 0.79], [0.79, 0.78, 0.75, 0.78, 0.79], [0.79, 0.79, 0.79, 0.79, 0.79]])
>>> np.around(unsharp_mask(array, radius=0.5, amount=2, preserve_range=True), 2) array([[100. , 100. , 99.99, 100. , 100. ], [100. , 99.39, 95.48, 99.39, 100. ], [ 99.99, 95.48, 147.59, 95.48, 99.99], [100. , 99.39, 95.48, 99.39, 100. ], [100. , 100. , 99.99, 100. , 100. ]])
- skimage.filters.wiener(data, impulse_response=None, filter_params=None, K=0.25, predefined_filter=None)[原始碼]#
最小均方誤差 (維納) 反向濾波器。
- 參數:
- data(M, N) ndarray
輸入資料。
- Kfloat 或 (M, N) ndarray
雜訊功率譜與未降級影像的功率譜之比率。
- impulse_response可呼叫
f(r, c, **filter_params)
濾波器的脈衝響應。請參閱 LPIFilter2D.__init__。
- filter_paramsdict,可選
脈衝響應函數的額外關鍵字參數。
- 其他參數:
- predefined_filterLPIFilter2D
如果您需要對不同的影像多次應用相同的濾波器,請建構 LPIFilter2D 並在此處指定。
- skimage.filters.window(window_type, shape, warp_kwargs=None)[原始碼]#
傳回給定大小和維度的 n 維視窗。
- 參數:
- window_type字串、浮點數或元組
要建立的視窗類型。此處允許使用
scipy.signal.get_window
支援的任何視窗類型。有關當前列表,請參閱下面的說明,或參閱您機器上 SciPy 版本的 SciPy 文件。- shape整數或整數元組
視窗沿每個軸的形狀。如果提供一個整數,則會產生一個 1D 視窗。
- warp_kwargs字典
傳遞給
skimage.transform.warp
的關鍵字參數(例如,warp_kwargs={'order':3}
以更改插值方法)。
- 傳回:
- nd_windowndarray
指定
shape
的視窗。dtype
為np.float64
。
注意事項
此函數基於
scipy.signal.get_window
,因此可以存取該函數可用的所有視窗類型(例如,"hann"
、"boxcar"
)。請注意,某些視窗類型需要以元組形式與視窗名稱一起提供的參數(例如,("tukey", 0.8)
)。如果僅提供浮點數,則將其解釋為 Kaiser 視窗的 beta 參數。有關更多詳細資訊,請參閱 https://scipy-docs.dev.org.tw/doc/scipy/reference/generated/scipy.signal.windows.get_window.html。
請注意,此函數會產生指定
shape
的雙精度陣列,因此會產生佔用大量可用記憶體的非常大的陣列。此處用於建立 nD 視窗的方法是首先計算從預期 nD 視窗的中心到陣列中每個位置的歐幾里得距離。該距離用於透過插值從
scipy.signal.get_window
傳回的 1D 視窗取樣。可以使用傳遞給skimage.transform.warp
的order
關鍵字參數來更改插值方法。輸出視窗中的某些座標將位於原始訊號之外;這些將用零填充。
視窗類型: - boxcar - triang - blackman - hamming - hann - bartlett - flattop - parzen - bohman - blackmanharris - nuttall - barthann - kaiser(需要 beta) - gaussian(需要標準差) - general_gaussian(需要功率、寬度) - slepian(需要寬度) - dpss(需要正規化的半頻寬) - chebwin(需要衰減) - exponential(需要衰減尺度) - tukey(需要錐形分數)
參考資料
[1]二維視窗設計,維基百科,https://en.wikipedia.org/wiki/Two_dimensional_window_design
範例
傳回形狀為 (512, 512) 的 Hann 視窗
>>> from skimage.filters import window >>> w = window('hann', (512, 512))
傳回 beta 參數為 16 且形狀為 (256, 256, 35) 的 Kaiser 視窗
>>> w = window(16, (256, 256, 35))
傳回 alpha 參數為 0.8 且形狀為 (100, 300) 的 Tukey 視窗
>>> w = window(('tukey', 0.8), (100, 300))
- class skimage.filters.LPIFilter2D(impulse_response, **filter_params)[原始碼]#
基礎:
object
線性位置不變濾波器(二維)
- __init__(impulse_response, **filter_params)[原始碼]#
- 參數:
- impulse_response可呼叫
f(r, c, **filter_params)
產生脈衝響應的函數。
r
和c
是代表行和列位置的一維向量,換句話說,座標為 (r[0],c[0])、(r[0],c[1]) 等。**filter_params
會被傳遞。換句話說,
impulse_response
將會被這樣呼叫>>> def impulse_response(r, c, **filter_params): ... pass >>> >>> r = [0,0,0,1,1,1,2,2,2] >>> c = [0,1,2,0,1,2,0,1,2] >>> filter_params = {'kw1': 1, 'kw2': 2, 'kw3': 3} >>> impulse_response(r, c, **filter_params)
- impulse_response可呼叫
範例
未標準化係數的高斯濾波器
>>> def filt_func(r, c, sigma=1): ... return np.exp(-(r**2 + c**2)/(2 * sigma**2)) >>> filter = LPIFilter2D(filt_func)