双三次插值的2倍上采样

时间:2019-02-20 13:47:30

标签: python interpolation bicubic

我想了解双三次插值的工作原理,为此,我选择了最简单的示例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

谢谢!

0 个答案:

没有答案