2017-08-26 70 views
4

我一直在嘗試理解屏蔽以及它如何與圖像過濾器一起工作。我使用下面的代碼來嘗試發展我的理解。試圖理解屏蔽

import scipy.ndimage as ndi 
import matplotlib.pyplot as plt 
import numpy as np 

# Generate a random binary mask 
np.random.seed(seed=182) 
mask = np.random.randint(2, size=(901, 877)) 

img = np.random.rand(901, 877) 

img_masked = np.ma.masked_array(img, mask = mask) 
img_masked_filtered = ndi.median_filter(img_masked, size=10) 
img_unmasked_filtered = ndi.median_filter(img, size=10) 

median_masked = np.ma.median(img_masked) 
median_unmasked = np.ma.median(img) 

在結果中,median_unmasked!=如我所料median_masked,但img_masked_filtered == img_unmasked_filtered我不想要的。 scipy.ndimage.median_filter完成我需要的工作,但它不適用於蒙版圖像。我可以使用什麼來做和中值濾波器一樣的功能,但是它可以在掩蓋的圖像上工作?

我用於數組的奇怪大小是因爲這是我最終要過濾的圖像的大小。

回答

1

ndimage過濾器不尊重蒙版陣列的蒙版。取而代之的是, 「面具」 一個普通的NumPy的陣列nan值,然後用ndimage.generic_filter調用np.nanmedian

import scipy.ndimage as ndi 
import matplotlib.pyplot as plt 
import numpy as np 

np.random.seed(seed=182) 
# h, w = 901, 877 
h, w = 10, 10 
mask = np.random.randint(2, size=(h, w)) 
img = np.random.rand(h, w) 
img_masked = np.where(mask, img, np.nan) 

size = 3 
img_masked_median = ndi.generic_filter(img_masked, np.nanmedian, size=size) 
img_unmasked_median = ndi.median_filter(img, size=size) 

fig, ax = plt.subplots(nrows=2, ncols=2) 
ax[0,0].imshow(img) 
ax[0,0].set_title('img') 
ax[0,1].imshow(img_masked) 
ax[0,1].set_title('img_masked') 
ax[1,0].imshow(img_unmasked_median) 
ax[1,0].set_title('img_unmasked_median') 
ax[1,1].imshow(img_masked_median) 
ax[1,1].set_title('img_masked_median') 
plt.show() 

enter image description here