我想了解双三次插值的工作原理,为此,我选择了最简单的示例2x上采样。
所以我知道我从一个图像数组开始,假设它是:
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 0 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,然后使用2 4 8 9进行P2,然后使用9 8 7 5进行P3,使用3 2 5 4进行P4进行最后一次插值。 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
谢谢!