最近邻插值法(nearest_neighbor)

1、原理与应用

        最近邻插值法nearest_neighbor是最简单的灰度值插值。也称作零阶插值,就是令变换后像素的灰度值等于距它最近的输入像素的灰度值。最近邻插值法可应用于图像的缩放,因为简单的变换与计算,效果一般不好。

        先假设一个2X2像素的图片采用最近邻插值法需要放大到4X4像素的图片,右边?该为多少。

2、公式及计算

最近邻插值法坐标变换计算公式(这个更简洁一点):

  AX=BX*(AW/BW)

  AY=BY*(AH/BH)

  • BXBY为目标图像的某个像素的横纵坐标
  • BWBH为目标图像的长与宽
  • AWAH为原图像的宽度与高度
  • AX,AY为目标图像在该点(BX,BY)对应的原图像的坐标

        如果是放大图像,(AW/BW)值小于1,同样将BX同比例映射到原图像的AX中,如果AW/BW=1,就相当于复制了图片。

        右图为经过放大后的目标图像,?处的坐标为(3,2),根据公式计算得到 

         AX=3*(2/4)=1.5, AY=2*(2/4)=1

        故?处的像素应该为原图像中的(1.5,1)像素的值,但是像素坐标没有小数,一般采用四舍五入取最邻,所以最终的结果为(2,1),对应原图像的橙色。其他类比得到放大后的图像:

3、代码实现 

"""
@author: 绯雨千叶

最邻近插值法
AX=BX*(AW/BW)
AY=BY*(AH/BH)
A为原图,B为目标图
"""
import cv2
import numpy as np


def nearest_1(img1):  # 手动版,需要自己设置目标图宽和高
    h1, w1, channels = img1.shape  # 取彩色图片的长、宽、通道
    h2 = 550  # 手动设置目标图像的高和宽
    w2 = 570
    img_n = np.zeros((h2, w2, channels), np.uint8)  
    for i in range(h2):
        for j in range(w2):
            AX = int(i * (h1 / h2))
            AY = int(j * (w1 / w2))
            img_n[i, j] = img1[AX, AY]
    return img_n


def nearest_2(img1):  # 自动倍数版,可以直接设置放大缩小的倍数
    h1, w1, channels = img1.shape  # 取彩色图片的长、宽、通道
    scale = 1.5  # 直接设置倍率,>1为放大,<1为缩小,暂不考虑负数
    h2= int(h1 * scale)
    w2= int(w1 * scale)
    img_n = np.zeros((h2, w2, channels), np.uint8)
    for i in range(h2):
        for j in range(w2):
            AX = int(i / scale)
            AY = int(j / scale)
            img_n[i, j] = img1[AX, AY]
    return img_n


img1 = cv2.imread("../img/lrn.jpg")  # 输入原图
img2 = nearest_1(img1)
img3 = nearest_2(img1)
cv2.imshow("img1", img1)
cv2.imshow("nearest_1", img2)  # 手动设置高宽版
cv2.imshow("nearest_2", img3)  # 自动写倍率版
cv2.waitKey(0)

效果展示 :

猜你喜欢

转载自blog.csdn.net/qq_58664081/article/details/129066184