2-кратное увеличение с бикубической интерполяцией - PullRequest
0 голосов
/ 20 февраля 2019

Я хотел бы понять, как работает бикубическая интерполяция, и для этого я выбрал самый простой пример - 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

Спасибо!

...