2016-12-21 3 views
1

У меня есть 2D-массив размером (3,2), и я должен повторить его, используя ближайший соседний, линейный и би-кубический метод интерполяции, чтобы размер стал (4,3).передискретизации 2D-матрицы numpy

Я использую Python, numpy и scipy для этого.

Как добиться повторной выборки входного массива?

+0

Что вы имеете в виду именно путем передискретизации? У вас есть ссылка на объяснение того, что это значит? –

+0

На самом деле, мне нужно преобразовать изображение с низким разрешением в высокое разрешение, но используя numpy. – Joel

+0

Я не думаю, что это возможно, если у вас нет лучшего исходного изображения с разрешением. После того, как вы взяли изображение, в этом изображении нет субпиксельной информации ... –

ответ

1

Существует хороший учебник по повторной выборке с использованием свертки 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), а би-кубика - кусочно-мудрая функция.

Вы также должны учитывать, какая часть интерполированного изображения действительна; по краям недостаточная поддержка ядра.

Би-кубическая интерполяция - лучший вариант для трех, поскольку спутниковые снимки идут.

Смежные вопросы