假設一個在內核上執行一些函數的通用滑動算法,如平均濾波器(平均濾波器)或圖像處理中算法的絕對差值總和。當內核滑到下一個位置時,將會有一些來自內存的冗餘讀取,因爲新內核包含的數據將與前一個內容重疊。有效的二維平均過濾器實現,可以最大限度地減少冗餘內存負載?
讓我用一個實際的例子來解釋...假設您想對內核(窗口)大小爲3x3的大型2D矩陣執行中值濾波。內核的第一個位置(下圖中的紅色)將以(1,1)爲中心,第二個位置(綠色)將以(1,2)爲中心。注意黃色區域是如何重疊的,現在這些值需要從內存中重新加載。
meanfilter http://luka.s3.amazonaws.com/meanfilter.png
我的具體問題是3D意味着過濾所以重疊更大(3^3-3^2 = 18,用於3D比3^2-3 = 6 2D)。
我確定這是一個常見問題......有誰知道這樣的算法是如何有效地實現以消除冗餘內存查找,或利用現代體系結構上CPU緩存的空間和時間局部性例如雙向關聯緩存)?
我在3D特定的問題需要從最近6個鄰居(不斜的)的平均值和用C實現如下:
for(i = 0; i <= maxi; i++) {
for(j = 0; j <= maxj; j++) {
for(k = 0; k <= maxk; k++) {
filteredData[ i ][ j ][ k ] =
ONE_SIXTH *
(
data[ i + 1 ][ j ][ k ] +
data[ i - 1 ][ j ][ k ] +
data[ i ][ j + 1 ][ k ] +
data[ i ][ j - 1 ][ k ] +
data[ i ][ j ][ k + 1 ] +
data[ i ][ j ][ k - 1 ]
);
}
}
}
+1有一個清晰明確的問題 – schnaader 2011-05-07 20:13:25