双线性插值

参考链接:

https://www.cnblogs.com/wancy/p/15212604.html

1、线性插值

2、双线性插值

代码如下:

from matplotlib import pyplot as plt
import numpy as np


def bilinear_interpolation(srcimage_vector, dstwidthtimes, dstheighttimes):
    print("原始图像", srcimage_vector)
    srcHeight = srcimage_vector.shape[0]
    srcWidth = srcimage_vector.shape[1]
    print("srcHeight", srcHeight)
    print("srcWidth", srcWidth)
    dstWidth, dstHeight = int(dstwidthtimes * srcWidth), int(dstheighttimes * srcHeight)
    # 定义一个三维矩阵存储目标图像,每个像素由RGB三种颜色组成,shape接受一个元组,可以创建多维矩阵
    dstVector = np.zeros(shape=(dstHeight, dstWidth, 3), dtype=int)  # 默认是float64
    # 遍历目标图像的每一个像素
    for dstY in range(0, dstHeight):
        for dstX in range(0, dstWidth):
            Q = [(0, 0)] * 4  # Q11=Q12=Q21=Q22=0
            Qdict = {}
            # 坐标换算
            dstX_srcX = dstX * (srcWidth / dstWidth)  # python中/表示除法,//表示整除
            dstY_srcY = dstY * (srcHeight / dstHeight)
            u = round(dstX_srcX % 1, 2)
            v = round(dstY_srcY % 1, 2)
            if int(dstX_srcX) == srcWidth - 1:
                positionX = [int(dstX_srcX) - 1, int(dstX_srcX)]  # 左右范围
            else:
                positionX = [int(dstX_srcX), int(dstX_srcX) + 1]  # 左右范围
            if int(dstY_srcY) == srcHeight - 1:
                positionY = [int(dstY_srcY) - 1, int(dstY_srcY)]  # 上下范围
            else:
                positionY = [int(dstY_srcY), int(dstY_srcY) + 1]  # 上下范围
            k = 0
            for m in range(0, 2):  # 得到Q的四个点坐标,分别是Q11,Q12,Q21,Q22
                for n in range(0, 2):
                    Q[k] = (positionX[m], positionY[n])
                    Qdict[Q[k]] = srcimage_vector[positionY[n], positionX[m]]
                    k = k + 1
            # 通过四个点计算得到dst的像素值
            dstVector[dstY][dstX] = Qdict[Q[0]] * (1 - u) * (1 - v) + Qdict[Q[1]] * (1 - u) * (v) + Qdict[Q[2]] * (
                u) * (
                                            1 - v) + Qdict[Q[3]] * (u) * (v)
    print(dstVector)
    ax = plt.gca()  # 获取到当前坐标轴信息
    ax.xaxis.set_ticks_position('top')  # 将X坐标轴移到上面
    plt.imshow(dstVector)  # 显示数组
    plt.show()
    plt.imsave('shaungxianxing.jpg', dstVector.astype(np.uint8))  # matplotlib保存图像的时候,只接受浮点数或者unit8的整数类型


if __name__ == "__main__":

    imagePath = "img/no_none/(0, 0).png"
    image_vector = plt.imread(imagePath)
    # dstwidth,dstheight用倍数表示,表示是src图像的多少倍
    # dstwidth, dstheight=1.5,1.5
    dstwidth, dstheight = 0.2, 0.2
    bilinear_interpolation(image_vector, dstwidth, dstheight)

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值