• pytorch双线性插值


    1、单线性插值

    在这里插入图片描述

    在这里插入图片描述
    化简得:
    重要公式
    在这里插入图片描述
    将y视为像素值的函数;

    在这里插入图片描述

    2、双线性插值

    问题:求P点的像素值?

    在这里插入图片描述

    根据单线性插值公式:

    1、得到R1和R2点的像素值:

    在这里插入图片描述

    2、然后通过R1和R2线性插值得到P点的像素值:

    在这里插入图片描述

    所以,一共使用了三次单线性插值得到,最终的像素值。

    另外,其中由于相邻像素点差1,所以y2 - y1 = 1 ,和x2-x1 = 1,所以分母就为1.

    最终得到的计算公式为:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    3、最近邻法

    使用下面公式,寻找最近一个像素值
    最近邻法
    其中:
    在这里插入图片描述

    存在问题:右偏移

    在这里插入图片描述
    原公式是右偏移的,新公式中心对其了。

    因为在原公式中是右偏移的,所以使用中心点重合来消除一下。

    下面是优化公式:
    在这里插入图片描述

    4、双线性插值简单实现

    通过最邻近找到P点,然后需要找到出四个相邻像素点。
    在这里插入图片描述
    通过floor函数找到下限,floor +1 找到上限,但是要防止超过图像的像素坐标值

    import numpy as np
    import matplotlib.pyplot as plt
    from PIL import Image
    
    
    def Bilinear(dst,des_w,des_h,src_w,src_h):
    
        for c in range(3):
            for dst_x in range(des_w):
                for dst_y in range(des_h):
                    src_x = (dst_x + 0.5)*src_w/des_w - 0.5
                    src_y = (dst_y + 0.5)*src_h/des_h - 0.5
    
                    #四个临近点
                    src_x_1 = int(np.floor(src_x))
                    src_y_1 = int(np.floor(src_y))
                    src_x_2 = min(src_x_1 + 1,src_w -1)
                    src_y_2 = min(src_y_1 + 1,src_h -1)
    
                    R1 = (src_x_2 - src_x) * src[src_y_1,src_x_1,c] + (src_x - src_x_1) * src[src_y_1,src_x_2,c]
                    R2 = (src_x_2 - src_x) * src[src_y_2,src_x_1,c] + (src_x - src_x_1) * src[src_y_2,src_x_2,c]
                    P = int((src_y_2 - src_y) * R1 + (src_y - src_y_1) * R2)
                    dst[dst_y, dst_x, c] = P
    
        return dst
    
    
    def show_img(dst):
        dst = dst.astype(np.uint8)
        plt.figure()
        plt.subplot(121)
        plt.imshow(src)
        plt.subplot(122)
        plt.imshow(dst)
        # plt.imsave("./img.png",dst)
        plt.show()
    
    
    if __name__ == '__main__':
    
        src = Image.open("./img_1.png")
        src_w = src.width
        src_h = src.height
        src = np.array(src)
    
        dst = np.ones((960, 1280, 3))
        des_w = dst.shape[1]
        des_h = dst.shape[0]
        # print(des_w,des_h)
    
        dst = Bilinear(dst,des_w,des_h,src_w,src_h)
        show_img(dst)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    在这里插入图片描述

    5、pytorch中双线性插值

    import torch
    from torch.nn import functional as F
    from PIL import Image
    import numpy as np
    import matplotlib.pyplot as plt
    
    img = Image.open("./img.png")
    img = np.array(img,dtype=float)
    print(img.shape)
    img = torch.from_numpy(img)
    print(img.shape)
    img = img.unsqueeze(0).permute(0,3,1,2) #[b,c,h,w]
    
    img = F.interpolate(img,scale_factor=(2,2),mode='bilinear')
    # print(img.shape)
    img = img.squeeze(0).permute(1,2,0)
    print(img.shape)
    
    a = torch.tensor(img, dtype=torch.uint8)
    print(a.shape)
    plt.figure()
    plt.imshow(a)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

  • 相关阅读:
    <html dir=ltr>是什么意思?
    matplotlib绘制曲线图
    Swing02
    C++项目实战——基于多设计模式下的同步&异步日志系统-⑫-日志宏&全局接口设计(代理模式)
    从join的实现窥探MySQL迭代器
    入户的第一眼,玄关设计小技巧!福州中宅装饰,福州装修
    第二十二章 源代码文件 REST API 参考(四)
    Java面试题学习-单例模式
    TCP/IP
    数论简单问题
  • 原文地址:https://blog.csdn.net/fksfdh/article/details/126068390