2017-08-26 11 views
4

私はマスキングを理解しようとしており、イメージフィルタでどのように動作するのかを理解しようとしています。私は私の理解を深めるために次のコードを使用しています。 median_unmaskedマスキングを理解しようとしています

結果で
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_maskedが、私はしたくない== img_unmasked_filteredをimg_masked_filtered。 scipy.ndimage.median_filterは私が必要とする仕事を正確に行いますが、マスクされた画像では機能しません。メジアンフィルタと同じことをするが、マスクされた画像で動作するものは何か?

私がアレイに使用している奇妙なサイズは、最終的にはフィルタリングしたい画像のサイズだからです。

答えて

1

ndimageフィルタはマスクされた配列のマスクを尊重しません。その後、代わりに、 "マスク" nan値が通常のnumpyの配列、およびnp.nanmedianを呼び出すためにndimage.generic_filterを使用します。

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

関連する問題