Я хотел бы понять, как работает бикубическая интерполяция, и для этого я выбрал самый простой пример - 2х с повышением.
Итак, я знаю, что я начинаю с массива изображений, скажем, так:
1 5 6 8 7
3 4 8 9 7
9 8 7 5 4
3 2 5 4 7
Поскольку я хочу увеличить результат в 2 раза, я добавлю 0 между столбцамии строки:
1 0 5 0 6 0 8 0 7
0 0 0 0 0 0 0 0 0
3 0 4 0 8 0 9 0 7
0 0 0 0 0 00 0 0 0
9 0 8 0 7 0 5 0 4
0 0 0 0 0 0 0 0 0
3 0 2 0 5 0 4 0 7
Я знаю, какполучить пиксель в 4,4 на новом изображении.Сначала мне нужно сделать кубическую интерполяцию с использованием 1 5 6 8 и получить P1, затем P2 с 2 4 8 9, затем P3 с 9 8 7 5 и P4 с 3 2 5 4. Наконец, мне нужно кубически интерполировать интенсивность пикселей сP1 P2 P3 P4.Моя главная задача - получить пиксель в 4,5 или 5,4
. Сейчас я пишу этот код на Python:
# Creo una nueva imagen vacia con el doble de las dimensiones anteriores
res_h = height *2
res_w = width *2
img = np.zeros((res_h, res_w, 1), np.uint8)
# Map original image into new, 2x resolution image
img[::2,::2,0] = self.imageA
# Recorro las filas de la imagen nueva
for i in range(3,res_h-4,2):
# Recorro las columnas de la imagen nueva
for j in range(3,res_w-4,2):
# Suponiendo a=-0.5 en la interpolacion cubica tengo estos valores para distancia 0.5 y 1.5
h1 = 0.5625 # distancia 0.5
h2 = -0.0625 # distancia 1.5
# Almaceno los 16 puntos de soporte usados para la interpolacion
Q11 = self.imageA[(i - 2)/2, (j - 2)/2]
Q12 = self.imageA[(i - 2)/2, (j - 1)/2]
Q13 = self.imageA[(i - 2)/2, (j + 1)/2]
Q14 = self.imageA[(i - 2)/2, (j + 2)/2]
Q21 = self.imageA[(i - 1)/2, (j - 2)/2]
Q22 = self.imageA[(i - 1)/2, (j - 1)/2]
Q23 = self.imageA[(i - 1)/2, (j + 1)/2]
Q24 = self.imageA[(i - 1)/2, (j + 2)/2]
Q31 = self.imageA[(i + 1)/2, (j - 2)/2]
Q32 = self.imageA[(i + 1)/2, (j - 1)/2]
Q33 = self.imageA[(i + 1)/2, (j + 1)/2]
Q34 = self.imageA[(i + 1)/2, (j + 2)/2]
Q41 = self.imageA[(i + 2)/2, (j - 2)/2]
Q42 = self.imageA[(i + 2)/2, (j - 1)/2]
Q43 = self.imageA[(i + 2)/2, (j + 1)/2]
Q44 = self.imageA[(i + 2)/2, (j + 2)/2]
# Interpolo cubicamente por filas y obtengo 4 puntos
P1 = Q11 * h2 + Q12 * h1 + Q13 * h1 + Q14 * h2
P2 = Q21 * h2 + Q22 * h1 + Q23 * h1 + Q24 * h2
P3 = Q31 * h2 + Q32 * h1 + Q31 * h1 + Q34 * h2
P4 = Q41 * h2 + Q42 * h1 + Q43 * h1 + Q44 * h2
# Interpolo cubicamente esos 4 puntos para obtener el pixel actual
pix = P1 * h2 + P2 * h1 + P3 * h1 + P4 * h2
img[i, j] = pix
Спасибо!