Эффективно заполнить маскированные значения массива с помощью отступа в Python - PullRequest
0 голосов
/ 23 января 2019

У меня есть квадратная матрица (изображение) с замаскированными значениями в области. Маска соответствует отсутствующим значениям в областях, близких к границе (всегда). Я хочу создать новое изображение, в котором замаскированные значения заменяются отражающими отступами значений, где существуют фактические значения изображения. Как я могу сделать это в Python?

В приведенном ниже примере я хочу заменить (левая панель) желтую область отраженным изображением средней панели, где существуют данные. В результате должно получиться что-то вроде изображения на правой панели (здесь отступы не соответствуют отражающим отступам, которые мне нужны, поскольку я только что использовал наивный рецепт right_image = np.where(temp.mask,middle_image[::-1,::-1],middle_image))

enter image description here

edit : я пытался поперечно перемещать изображение и использовать заполнение с помощью NUMPY, с приведенным ниже кодом, но это не работает:

# Row Reflect 
# Here out_image is the original image, where -2 is no data value
xx = []
for i in range(6000): # Number of rows
    temp1 = np.ma.array(out_image[0,i,:],mask= out_image[0,i,:]==-2) # Create mask per row, -2 is the masked value
    edges = ma.flatnotmasked_edges(temp1) # Find edges
    #if edges is not None:
    xx += [np.expand_dims(np.pad(temp1.data[edges[0]:edges[1]],((edges[0],temp1.shape[0]-edges[1])),mode='reflect'),0)]
out = np.concatenate(xx)
#out = out.reshape(2000,2000)

Результат неверный. enter image description here

1 Ответ

0 голосов
/ 23 января 2019

Если я правильно понимаю, вы хотите добавить отражение (поворот на 180 °) в замаскированную область.Вы можете использовать scipy.ndimage.rotate ( документы ) и добавить оба изображения.

Что-то вроде этой работы?:

from scipy.ndimage import rotate
# sample mask for a 768 * 1024 image
line = lambda x: 400 - 200 * x/800   
mask = np.indices(im.shape[:2])
mask = line(mask[0])<mask[1]

plt.imshow(im*mask[:,:,None])
plt.show()

im2=rotate(im, 180) 
plt.imshow(im*mask[:,:,None] + im2*~mask[:,:,None])
plt.show()

Original Image Output

...