我最近在answer to this post中瞭解到strides,並且想知道如何使用它們來計算比我在this post(使用卷積濾波器)中提出的更高效的移動平均濾波器。使用高效移動平均濾波器的步幅
這是我到目前爲止。它採用原始數組的視圖,然後將其滾動必要的數量,然後求和內核值以計算平均值。我意識到邊緣處理不正確,但我可以在這之後照顧...有更好更快的方法嗎?其目標是過濾大型浮點陣列,最大尺寸爲5000x5000 x 16層,這是一項任務,其工作相當緩慢。
請注意,我正在尋找8鄰居連接,即3x3濾鏡取9個像素(焦點像素周圍8個)的平均值,並將該值分配給新圖像中的像素。我如何看到該工作
import numpy, scipy
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))
for i in range(0, filtsize-1):
if i > 0:
b += numpy.roll(b, -(pow(filtsize,2)+1)*i, 0)
filtered = (numpy.sum(b, 1)/pow(filtsize,2)).reshape((a.shape[0],a.shape[1]))
scipy.misc.imsave("average.jpg", filtered)
EDIT澄清:
當前代碼:
- 使用stride_tricks以產生,例如[[0,1,2陣列],[1,2, 3],[2,3,4] ...],它對應於濾波器內核的第一行。
- 沿着縱軸滾動以獲取內核的中間行[[10,11,12],[11,12,13],[13,14,15] ...]並將其添加到數組中我得到了1)
- 重複以獲得內核[[20,21,22],[21,22,23],[22,23,24] ...]的底行。此時,我將每行的總和除以濾鏡中元素的數量,給出每個像素的平均值(移動1行和1列,邊緣有一些奇特點,但我可以以後照顧)。
我期望的是更好地使用stride_tricks來直接獲取9個值或內核元素的總和,對於整個數組,或者有人可以讓我相信另一個更有效的方法。
我試着運行你的代碼,但得到了內存損壞錯誤。我在Ubuntu 10.10,64位上運行Python 2.6.6和Numpy 1.3.0。錯誤看起來像`*** glibc detected *** python:double free or corruption(!prev):0x0000000002526d30 ***`。 – mtrw 2011-02-08 18:55:15
我可以問爲什麼你使用浮動(我假設64位)來表示可以(可能)更有效地存儲和使用整數計算的圖像? – Paul 2011-02-08 18:58:07
您的示例是2D數組,但您將數據描述爲3D。你是否爲16層中的每一層做這個操作? – Paul 2011-02-08 19:00:34