Существует хороший учебник по повторной выборке с использованием свертки here.
Для целочисленный коэффициент масштабирования вверх:
import numpy
import scipy
from scipy import ndimage, signal
# Scale factor
factor = 2
# Input image
a = numpy.arange(16).reshape((4,4))
# Empty image enlarged by scale factor
b = numpy.zeros((a.shape[0]*factor, a.shape[0]*factor))
# Fill the new array with the original values
b[::factor,::factor] = a
# Define the convolution kernel
kernel_1d = scipy.signal.boxcar(factor)
kernel_2d = numpy.outer(kernel_1d, kernel_1d)
# Apply the kernel by convolution, seperately in each axis
c = scipy.signal.convolve(b, kernel_2d, mode="valid")
Обратите внимание, что коэффициент может быть различным для каждой оси, и вы можете также применить свертку последовательно на каждой оси. Ядра для билинейной и би-кубики также показаны в ссылке, причем билинейная интерполяция использует треугольный сигнал (scipy.signal.triang
), а би-кубика - кусочно-мудрая функция.
Вы также должны учитывать, какая часть интерполированного изображения действительна; по краям недостаточная поддержка ядра.
Би-кубическая интерполяция - лучший вариант для трех, поскольку спутниковые снимки идут.
Что вы имеете в виду именно путем передискретизации? У вас есть ссылка на объяснение того, что это значит? –
На самом деле, мне нужно преобразовать изображение с низким разрешением в высокое разрешение, но используя numpy. – Joel
Я не думаю, что это возможно, если у вас нет лучшего исходного изображения с разрешением. После того, как вы взяли изображение, в этом изображении нет субпиксельной информации ... –