Обычно это можно сделать с помощью scipy.interpolate.interp2d. Однако, поскольку маска одинакова для всех патчей и я всегда интерполирую одни и те же координаты, я ищу более эффективный подход.
В частности, я хочу предварительно вычислить матрицу преобразования A , который применяется к известным пикселям, что позволяет мне интерполировать недостающие пиксели посредством простого умножения матрицы на вектор. Этот метод должен использовать тот факт, что бикубическая интерполяция является линейной, поэтому должна быть возможность выразить интерполяцию как y=A@x, где x представляет известные значения пикселей, а y > представляет интерполированный результат. Как я могу построить такую матрицу преобразования для бикубической интерполяции на маскированной двумерной сетке?
Вот простой фрагмент кода:
Код: Выделить всё
import numpy as np
import matplotlib.pyplot as plt
from skimage import data, img_as_float
from skimage.util import random_noise
from skimage.metrics import peak_signal_noise_ratio as psnr
from scipy.ndimage import zoom
image = img_as_float(data.astronaut())
gray_image = np.mean(image, axis=2)
patch_size = 32
patch = gray_image[:patch_size, :patch_size]
mask = np.random.rand(*patch.shape) > 0.2
masked_patch = patch.copy()
masked_patch[~mask] = 0
fig, axs = plt.subplots(1, 2, figsize=(12, 4))
axs[0].imshow(patch, cmap='gray')
axs[0].set_title('Original Patch')
axs[1].imshow(masked_patch, cmap='gray')
axs[1].set_title('Masked Patch')
for ax in axs:
ax.axis('off')
plt.show()
Подробнее здесь: https://stackoverflow.com/questions/791 ... -masked-2d