Python实现图像最近邻插值算法详解

小林子
小林子
发布时间:2026-10-15 | 4人浏览过
原创

本文深入解析图像处理中的最近邻插值算法,详细阐述其坐标映射原理与Python实现流程。通过代码示例展示如何根据缩放比例计算源像素点,并分析放大后图像出现的锯齿效应与方格现象,帮助开发者理解该算法的优缺点及适用场景。

引言:

最近邻插值Nearest Neighbour Interpolate算法是图像处理中广泛使用的尺寸缩放方法,因其实现简单且计算速度快,受到众多工程师的青睐。

图像插值技术是图像超分辨率领域的关键研究方向之一,旨在基于已有的低分辨率图像(Low Resolution,LR)生成高分辨率图像(High Resolution,HR)。

本文一方面分析最邻近插值算法的具体流程,另一方面利用Python实现基础的最近邻插值算法。

注:网络资料中对该术语的翻译存在差异,有的译为“近邻”,有的译为“临近”。

1、最近邻插值算法思想

插值的目的是根据已知图像的像素值推断未知目标图像的像素值,其插值变换过程如下图所示(PPT制作背景未去除):

其中src表示原始图像,tar表示通过插值得到的目标图像,H和W分别代表图像的高度和宽度。插值的核心在于建立(tar_x, tar_y)与(src_x, src_y)之间的映射关系,从而为目标图像的每个像素点进行赋值。假设目标是将原始图像的长度和宽度分别扩大3倍和4倍,即:

ratio_H = tar_H/src_H = tar_x/src_x = 3
ratio_W = tar_W/src_W = tar_y/src_y = 4

通过上述公式变形,可以得到目标图像像素点与原始图像像素点的映射关系如下:

tar_x = src_x/ratio_H
tar_y = src_y/ratio_W

明确了像素点间的映射关系后,算法的实现便相对简单,具体流程如下:

  • (1)根据tar_H和tar_W创建目标图像
  • (2)计算缩放比例因子ratio
  • (3)遍历目标图像的每个像素点,计算对应的映射关系
  • (4)遍历目标图像的每个像素点,使用原始图像中对应的像素值对其进行赋值

2、python实现最邻近插值

基于前述理论分析,实现过程较为直观。在自行实现过程中,较难理解的部分在于“坐标变换关系”。若将原始图像放大整数倍,例如将10x10的图像放大至20x20,那么20x20图像中任意像素点(tar_x,tar_y)的值直接取自原始10x10图像的(src_x,src_y)=int(tar_x/2, tar_y/2),即正好是除以2的位置;然而,实际应用中常需放大小数倍,例如将10x10放大至15x15,此时(tar_x, tar_y)的值来自10x10图像中(src_x, src_y)=int(tar_x/1.5, tar_y/1.5)。

代码如下:

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, 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

得到的插值结果如下:

可以看出,插值后的图像存在明显的锯齿效应,多处出现了“方格”现象。

到此这篇关于python实现图像最近邻插值的文章就介绍到这了,更多相关python图像邻插值内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表