Усреднение по изображениям и последующая интерполяция nan

#python #numpy #image-processing #scipy

#python #numpy #обработка изображений #scipy

Вопрос:

У меня есть стопка спутниковых снимков, которые все сделаны за короткий период времени, но ни один из них не обеспечивает достаточного охвата моей области исследования. Поэтому я хотел бы:

  1. Усредняйте их все вместе — игнорируя nan, если в этом местоположении есть хотя бы одна другая допустимая точка данных
  2. интерполируйте по массиву, чтобы заполнить пробелы — если только нет допустимой точки данных с n пикселями этого местоположения. Если это так, я просто сохраню его как nan и проигнорирую его при окончательной обработке.

Пока у меня есть:

 initial_satellite_data.shape
>>> (5, 500, 500, 2)
# This is five images, 500x500 pixels, and two bands per image.

# need to convert this to float in order to do the next step
sat_data_float = initial_satellite_data.astype(np.float32)

# 255 values signify areas without data, so converting that to nan
sat_data_float[sat_data_float==255]=np.nan

# get the average across the different images
average_image = np.nanmean(np_imageset, axis=0)

average_image.shape
>>> (500, 500, 2)
  

Но я не совсем понимаю, как я могу интерполировать данные, чтобы заполнить пробелы, которые все еще содержат данные nan, вместе с моим предостережением о нежелании интерполировать, если у пикселя нет действительных данных с n-пикселями.

В качестве примера того, как примерно могут отображаться данные, вот некоторый код, генерирующий вид шума, который я хочу интерполировать, и вид отсутствующих фрагментов, которые я не хочу интерполировать на изображении с одним диапазоном:

 import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 1, 500)
y = x[:, None]
average_image = x   y

# Destroy some values - this is about the amount of missing 
# data I have that I want to interpolate across
mask = np.random.random(average_image.shape) > 0.98
average_image[mask] = np.nan

# Now destroy a whole corner that might be missing and it 
# doesn't make sense to interpolate into this mass of missing data
average_image[0:80, 0:80] = np.nan

# Here should be some interpolation process, I've been able to interpolate in 1D across the row and that actually works well 
# enough to get rid of the missing individual pixels but I can't do a sanity check to make sure it isn't interpolating a pixel 50 pixels away from real data.
interpolated_image = average_image

fig, (ax0, ax1) = plt.subplots(1, 2)

ax0.imshow(average_image, cmap='gray', interpolation='nearest')
ax0.set_title('Input image')
ax1.imshow(interpolated_image, cmap='gray', interpolation='nearest')
ax1.set_title('Interpolated data')
plt.show()
  

вывод matplotlib

Комментарии:

1. вы можете использовать окрестность nxn вокруг nan пикселей и присвоить этому пикселю среднее значение

2. Если вы поделитесь некоторыми данными и определите местоположение, где вы делаете интерполяцию, и местоположение, где вы не хотите ее выполнять, я попробую завтра. Также скажите мне n , измеряется ли оно горизонтально, вертикально или в каком-либо направлении.

3. Привет @MarkSetchell, я добавил несколько примеров данных с подробностями. Я думаю, n должно быть 3 пикселя и измеряться в любом направлении.