2017-08-26 7 views
4

Ich habe versucht zu verstehen, Maskierung und wie es mit Bild-Filter funktioniert. Ich verwende den folgenden Code, um zu versuchen, mein Verständnis zu entwickeln.Versuchen, Maskierung zu verstehen

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) 

In den Ergebnissen median_unmasked! = Median_masked wie ich erwarten würde, aber img_masked_filtered == img_unmasked_filtered, die ich nicht will. scipy.ndimage.median_filter erledigt genau den Job, den ich brauche, funktioniert aber nicht mit maskierten Bildern. Was kann ich verwenden, das dasselbe wie der Medianfilter tut, aber der auf einem maskierten Bild funktioniert?

Die seltsame Größe, die ich für das Array verwende, ist, weil das die Größe des Bildes ist, das ich schließlich filtern möchte.

Antwort

1

Die ndimage Filter beachten Maskenmasken nicht. Stattdessen "Maske" eine gewöhnliche NumPy Array mit nan Werten und dann ndimage.generic_filter verwenden, um np.nanmedian zu nennen:

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

Verwandte Themen