插值原理:将原图像像素值提取出来赋值给新图像
设原图像像素点坐标分别为 (src_x, src_y),目标图像像素点坐标为 (tar_x, tar_y),插值的核心就是找到这两张图像坐标之间的映射关系。
最邻近插值采用将目标图像按比例缩小,找到与目标图像最邻近的点建立映射关系。
下面是实现的python代码
import numpy as np from PIL import Image def nearest(image, target_size): """ Nearest Neighbour interpolate for RGB image :param image: rgb image :param target_size: tuple = (height, width) :return: None """ if target_size[0] < image.shape[0] or target_size[1] < image.shape[1]: raise ValueError("target image must bigger than input image") # 1:按照尺寸创建目标图像 target_image = np.zeros(shape=(target_size[0], target_size[1], 3)) # 2:计算height和width的缩放因子 alpha_h = target_size[0] / image.shape[0] alpha_w = target_size[1] / image.shape[1] for tar_x in range(target_image.shape[0] - 1): for tar_y in range(target_image.shape[1] - 1): # 3:计算目标图像人任一像素点 # target_image[tar_x,tar_y]需要从原始图像 # 的哪个确定的像素点image[src_x, xrc_y]取值 # 也就是计算坐标的映射关系 src_x = round(tar_x / alpha_h) src_y = round(tar_y / alpha_w) # 4:对目标图像的任一像素点赋值 target_image[tar_x, tar_y] = image[src_x, src_y] return target_image path = './1.png' image = Image.open(path) image = np.array(image) target = nearest(image, (1024, 1024)) target = Image.fromarray(target.astype('uint8')).convert('RGB') target.save('./target.png', 'png')