参考链接:
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)