1.最邻近插值 The nearest interpolation
原理:划分四个区域,将某点值赋给区域的所有值
def the_nearest_interpolation(img, nh, nw): h, w, c = img.shape # h是height,w是width,c是channels emptyImage = np.zeros((nh, nw, c), np.uint8) sh = nh/h sw = nw/w for i in range(nh): for j in range(nw): x = int(i/sh) y = int(j/sw) emptyImage[i, j] = img[x, y] return emptyImage
2.双线性插值
原理:利用两次单线性计算点
def bilinear_interpolation(img,out_dim): src_h, src_w, channel = img.shape # 原参数 dst_h, dst_w = out_dim[1], out_dim[0] # 目标参数 if src_h == dst_h and src_w == dst_w: return img.copy() # 创建目标图像 dst_img = np.zeros((dst_h, dst_w, 3), dtype=np.uint8) # 计算写x,y比 scale_x, scale_y = float(src_w) / dst_w, float(src_h) / dst_h for i in range(3): for dst_y in range(dst_h): for dst_x in range(dst_w): # 平移得到几何中心 src_x = (dst_x + 0.5) * scale_x-0.5 src_y = (dst_y + 0.5) * scale_y-0.5 # 找到中心点旁用于计算的点 src_x0 = int(np.floor(src_x)) src_x1 = min(src_x0 + 1 ,src_w - 1) src_y0 = int(np.floor(src_y)) src_y1 = min(src_y0 + 1, src_h - 1) # 计算插值 temp0 = (src_x1 - src_x) * img[src_y0,src_x0,i] + (src_x - src_x0) * img[src_y0,src_x1,i] temp1 = (src_x1 - src_x) * img[src_y1,src_x0,i] + (src_x - src_x0) * img[src_y1,src_x1,i] dst_img[dst_y,dst_x,i] = int((src_y1 - src_y) * temp0 + (src_y - src_y0) * temp1) return dst_img