1、原理与应用
最近邻插值法nearest_neighbor是最简单的灰度值插值。也称作零阶插值,就是令变换后像素的灰度值等于距它最近的输入像素的灰度值。最近邻插值法可应用于图像的缩放,因为简单的变换与计算,效果一般不好。
先假设一个2X2像素的图片采用最近邻插值法需要放大到4X4像素的图片,右边?该为多少。
2、公式及计算
最近邻插值法坐标变换计算公式(这个更简洁一点):
AX=BX*(AW/BW)
AY=BY*(AH/BH)
- BX与BY为目标图像的某个像素的横纵坐标
- BW与BH为目标图像的长与宽
- AW与AH为原图像的宽度与高度
- 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)
效果展示 :