generic_filter#
- scipy.ndimage.generic_filter(input, function, size=None, footprint=None, output=None, mode='reflect', cval=0.0, origin=0, extra_arguments=(), extra_keywords=None, *, axes=None)[原始碼]#
使用給定函數計算多維濾波器。
在每個元素上都會呼叫提供的函數。該元素濾波器足跡內的輸入值會以雙精度值的一維陣列形式傳遞給函數。
- 參數:
- inputarray_like
輸入陣列。
- function{callable, scipy.LowLevelCallable}
要應用於每個元素的函數。
- size純量或元組,選用
請參閱下方的 footprint。如果已指定 footprint,則忽略。
- footprint陣列,選用
必須定義 size 或 footprint 其中之一。size 指定從輸入陣列中取得的形狀,在每個元素位置,以定義濾波器函數的輸入。footprint 是一個布林陣列,它(隱含地)指定一個形狀,以及此形狀內哪些元素將傳遞給濾波器函數。因此,
size=(n,m)
等效於footprint=np.ones((n,m))
。我們會調整 size 以符合輸入陣列的維度數,因此,如果輸入陣列的形狀為 (10,10,10),且 size 為 2,則實際使用的 size 為 (2,2,2)。當指定 footprint 時,會忽略 size。- output陣列或 dtype,選用
放置輸出的陣列,或傳回陣列的 dtype。預設情況下,將建立與輸入相同 dtype 的陣列。
- mode{‘reflect’, ‘constant’, ‘nearest’, ‘mirror’, ‘wrap’}, 選用
mode 參數決定輸入陣列如何在其邊界之外延伸。預設值為 ‘reflect’。每個有效值的行為如下
- ‘reflect’ (d c b a | a b c d | d c b a)
輸入會透過在最後一個像素邊緣反射來延伸。此模式有時也稱為半樣本對稱。
- ‘constant’ (k k k k | a b c d | k k k k)
輸入會透過以相同的常數值(由 cval 參數定義)填滿邊緣之外的所有值來延伸。
- ‘nearest’ (a a a a | a b c d | d d d d)
輸入會透過複製最後一個像素來延伸。
- ‘mirror’ (d c b | a b c d | c b a)
輸入會透過在最後一個像素中心反射來延伸。此模式有時也稱為全樣本對稱。
- ‘wrap’ (a b c d | a b c d | a b c d)
輸入會透過環繞到相對邊緣來延伸。
為了與插值函數保持一致,也可以使用以下模式名稱
- ‘grid-mirror’
這是 ‘reflect’ 的同義詞。
- ‘grid-constant’
這是 ‘constant’ 的同義詞。
- ‘grid-wrap’
這是 ‘wrap’ 的同義詞。
- cval純量,選用
如果 mode 為 ‘constant’,則填滿輸入邊緣之外的值。預設值為 0.0。
- originint 或序列,選用
控制濾波器在輸入陣列像素上的放置位置。值 0(預設值)將濾波器置於像素中心,正值會將濾波器向左移動,負值則向右移動。透過傳遞與輸入陣列維度數相同的 origin 序列,可以沿每個軸指定不同的偏移。
- extra_arguments序列,選用
要傳遞給已傳遞函數的額外位置引數序列。
- extra_keywordsdict,選用
要傳遞給已傳遞函數的額外關鍵字引數字典。
- axesint 或 None 的元組,選用
如果為 None,則沿所有軸篩選 input。否則,沿指定的軸篩選 input。當指定 axes 時,用於 size 或 origin 的任何元組都必須符合 axes 的長度。這些元組中的第 i 個項目對應於 axes 中的第 i 個項目。
- 傳回:
- generic_filterndarray
已篩選陣列。具有與 input 相同的形狀。
註解
此函數也接受低階回呼函數,其具有以下其中一種簽章,並包裝在
scipy.LowLevelCallable
中int callback(double *buffer, npy_intp filter_size, double *return_value, void *user_data) int callback(double *buffer, intptr_t filter_size, double *return_value, void *user_data)
呼叫函數會迭代輸入和輸出陣列的元素,並在每個元素呼叫回呼函數。目前元素濾波器足跡內的元素會透過
buffer
參數傳遞,而足跡內的元素數目則透過filter_size
傳遞。計算出的值會在return_value
中傳回。user_data
是提供給scipy.LowLevelCallable
的資料指標,依原樣。回呼函數必須傳回整數錯誤狀態,如果發生錯誤則為零,否則為一。如果發生錯誤,您通常應該在使用資訊豐富的訊息傳回之前設定 Python 錯誤狀態,否則呼叫函數會設定預設錯誤訊息。
此外,還接受其他一些低階函數指標規格,但這些規格僅用於向後相容性,不應在新程式碼中使用。
範例
匯入必要的模組並載入用於濾波的範例影像。
>>> import numpy as np >>> from scipy import datasets >>> from scipy.ndimage import zoom, generic_filter >>> import matplotlib.pyplot as plt >>> ascent = zoom(datasets.ascent(), 0.5)
透過傳遞簡單的 NumPy 聚合函數作為 function 的引數,計算核心大小為 5 的最大值濾波器。
>>> maximum_filter_result = generic_filter(ascent, np.amax, [5, 5])
雖然最大值濾波器也可以直接使用
maximum_filter
取得,但generic_filter
允許將泛型 Python 函數或scipy.LowLevelCallable
用作濾波器。在這裡,我們計算最大值和最小值之間的範圍,作為核心大小為 5 的範例。>>> def custom_filter(image): ... return np.amax(image) - np.amin(image) >>> custom_filter_result = generic_filter(ascent, custom_filter, [5, 5])
繪製原始影像和已濾波影像。
>>> fig, axes = plt.subplots(3, 1, figsize=(3, 9)) >>> plt.gray() # show the filtered result in grayscale >>> top, middle, bottom = axes >>> for ax in axes: ... ax.set_axis_off() # remove coordinate system >>> top.imshow(ascent) >>> top.set_title("Original image") >>> middle.imshow(maximum_filter_result) >>> middle.set_title("Maximum filter, Kernel: 5x5") >>> bottom.imshow(custom_filter_result) >>> bottom.set_title("Custom filter, Kernel: 5x5") >>> fig.tight_layout()