首頁  >  文章  >  後端開發  >  如何使用跨步實現高效的移動平均濾波器?

如何使用跨步實現高效的移動平均濾波器?

Barbara Streisand
Barbara Streisand原創
2024-10-19 12:19:01792瀏覽

How to Implement an Efficient Moving Average Filter using Strides?

使用跨步實現高效移動平均濾波器

在之前的討論中,探討了使用跨步實現計算高效的移動平均濾波器的好處。在這裡,我們進一步深入研究這個主題並提供詳細的實現。

使用步幅進行高效移動平均過濾

要使用步幅有效計算移動平均過濾器,您可以利用numpy.lib.stride_tricks 中的as_strided()函數。此函數可讓您建立模仿指定維度的移動視窗的陣列視圖。

考慮以下程式碼:

<code class="python">filtsize = 3
a = numpy.arange(100).reshape((10,10))
b = numpy.lib.stride_tricks.as_strided(a, shape=(a.size,filtsize), strides=(a.itemsize, a.itemsize))</code>

這裡,as_strided() 函數建立一個視圖將陣列視為一系列重疊窗口,每個視窗的形狀為(100 - filtsize 1, filtsize )。

捲動視窗

移動視窗,您可以使用numpy.roll() 函數:

<code class="python">for i in range(0, filtsize-1):
    if i > 0:
        b += numpy.roll(b, -(pow(filtsize,2)+1)*i, 0)</code>

這會迭代地將視窗移到filtsize列,有效模擬視窗在原始數組上的移動。

計算平均值

要計算平均值,您可以簡單地將每行中的值相加,然後除以過濾器中的元素數量:

<code class="python">filtered = (numpy.sum(b, 1) / pow(filtsize,2)).reshape((a.shape[0],a.shape[1]))</code>

這給你陣列中每個像素的移動平均值。

多維移動平均值

可以使用提供的rolling_window()函數擴展上述方法來處理多維移動平均值by numpy:

<code class="python">def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)</code>

此函數可讓您沿著陣列的任意軸建立移動視窗視圖。

記憶體最佳化

很重要需要注意的是,雖然跨步技巧可能很有效,但在處理多維數組時它們也會導致記憶體開銷。 scipy.ndimage.uniform_filter() 函數提供了一種替代方法,可以有效地處理多維移動平均值,並且不會產生與跨步技巧相關的記憶體開銷。

以上是如何使用跨步實現高效的移動平均濾波器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn