1
在matlab中有函數用於獲取每個條目的n個最近條目的平均值。在python中創建matlab平均過濾器
x=np.array([[0.1,0.8,.2],
[0.5,0.2,np.nan],
[0.7,0.2,0.9],
[0.4,0.7,1],
[np.nan,0.14,1]])
在MATLAB創建平均濾波器:
x=[[0.1,0.8,.2],
[0.5,0.2,nan],
[0.7,0.2,0.9],
[0.4,0.7,1],
[nan,0.14,1]]
fspecial('average',[3,3])
filter2(ave1,x)
[[ 0.17777778 nan nan]
[ 0.27777778 nan nan]
[ 0.3 nan nan]
[ nan nan 0.43777778]
[ nan nan 0.31555556]]
我想將其轉換爲蟒蛇。 我發現這一點: uniform filter 和: skimage.filters.rank.mean
,但結果不一樣MATLAB。統一的過濾器:
x=np.array([[0.1,0.8,.2],
[0.5,0.2,np.nan],
[0.7,0.2,0.9],
[0.4,0.7,1],
[np.nan,0.14,1]])
print(uniform_filter(x, size=3, mode='constant'))
[[ 0.17777778 nan nan]
[ 0.27777778 nan nan]
[ 0.3 nan nan]
[ nan nan nan]
[ nan nan nan]]
skimage過濾器:
from skimage.filters.rank import mean
from skimage.morphology import square
from skimage import img_as_float
x=np.array([[0.1,0.8,.2],
[0.5,0.2,np.nan],
[0.7,0.2,0.9],
[0.4,0.7,1],
[np.nan,0.14,1]])
print(mean(x, square(3)))
[[102 76 76]
[106 102 97]
[114 130 127]
[ 90 142 167]
[ 79 137 181]]
print(img_as_float(mean(x, square(3))))
[[ 0.4 0.29803922 0.29803922]
[ 0.41568627 0.4 0.38039216]
[ 0.44705882 0.50980392 0.49803922]
[ 0.35294118 0.55686275 0.65490196]
[ 0.30980392 0.5372549 0.70980392]]
最後我不得不自己,但在性能上還不成熟:
x=np.array([[0.1,0.8,.2],
[0.5,0.2,np.nan],
[0.7,0.2,0.9],
[0.4,0.7,1],
[np.nan,0.14,1]])
Winsize=3
adder=int(Winsize/2)
result=np.zeros_like(x)
nan_window_index=np.array([])
for i in range(x.shape[0]):
for j in range(x.shape[1]):
top_left_r= int(i-adder)
top_left_c= int(j-adder)
bottom_right_r=int(i+adder)
bottom_right_c=int(j+adder)
sum_list=np.array([])
for r_counter in range(top_left_r, bottom_right_r+1):
if r_counter<0 or r_counter > x.shape[0]-1:
continue
for c_counter in range(top_left_c, bottom_right_c+1):
if c_counter<0 or c_counter > x.shape[1]-1:
continue
if not np.isnan(x[r_counter, c_counter]):
sum_list=np.append(sum_list, x[r_counter, c_counter])
else:
nan_window_index=np.append(nan_window_index, [[r_counter, c_counter]])
result[i,j]= np.sum(sum_list)/(Winsize*Winsize)
nan_window_index=np.unique(nan_window_index.reshape(int(len(nan_window_index)/2),2), axis=0)
for i,j in nan_window_index:
top_left_r= int(i-adder)
top_left_c= int(j-adder)
bottom_right_r=int(i+adder)
bottom_right_c=int(j+adder)
for r_counter in range(top_left_r, bottom_right_r+1):
if r_counter<0 or r_counter > x.shape[0]-1:
continue
for c_counter in range(top_left_c, bottom_right_c+1):
if c_counter<0 or c_counter > x.shape[1]-1:
continue
result[r_counter, c_counter]=np.nan
print(result)
,結果是一樣的MATLAB:
[[ 0.17777778 nan nan]
[ 0.27777778 nan nan]
[ 0.3 nan nan]
[ nan nan 0.43777778]
[ nan nan 0.31555556]]
any suggestio ñ更好的表現?