一. 最近鄰插值法放大圖像:
最近鄰插值法在放大圖像時補充的像素是最近鄰的像素的值。由於方法簡單,所以處理速度很快,但是放大圖像畫質劣化明顯,常常含有鋸齒邊緣。

最近鄰插值法算法原理 ↑
二. 最近鄰插值法算法流程:
插值法放大圖像的第一步都是相同的,計算新圖的坐標點像素值對應原圖中哪個坐標點的像素值來填充,計算公式為:
srcX = dstX * (srcWidth/dstWidth)
srcY = dstY * (srcHeight/dstHeight)
其中,src表示舊圖,dst表示新圖。新圖的坐標(dstX,dstY)對應於舊圖的坐標(srcX,srcY)。 srcWidth/dstWidth 和 srcHeight/dstHeight 分別表示寬和高的放縮比。
那么問題來了,通過這個公式算出來的 srcX,scrY (舊圖坐標)有可能是小數,但是坐標點是不存在小數的,都是整數,得想辦法把它轉換成整數才行。
不同插值法的區別就體現在 srcX,scrY 是小數時,怎么變成整數去取原圖像中的像素值。
最近鄰插值法:看名字就很直白,四舍五入選取最接近的整數。這樣的做法會導致像素的變化不連續,在新圖中會產生鋸齒。
三. 實驗 python實現最近鄰插值算法
1 from PIL import Image 2 import matplotlib.pyplot as plt 3 import numpy as np 4 import math 5 6 # 最近鄰插值算法 7 # dstH為新圖的高;dstW為新圖的寬 8 def NN_interpolation(img,dstH,dstW): 9 scrH,scrW,_=img.shape 10 retimg=np.zeros((dstH,dstW,3),dtype=np.uint8) 11 for i in range(dstH-1): 12 for j in range(dstW-1): 13 scrx=round(i*(scrH/dstH)) 14 scry=round(j*(scrW/dstW)) 15 retimg[i,j]=img[scrx,scry] 16 return retimg 17 18 im_path='../paojie.jpg' 19 image=np.array(Image.open(im_path)) 20 21 image1=NN_interpolation(image,image.shape[0]*2,image.shape[1]*2) 22 image1=Image.fromarray(image1.astype('uint8')).convert('RGB') 23 image1.save('out.png')
四. 實驗結果:

原圖 ↑

最近鄰插值后圖像 ↑
可以看到新圖中產生了鋸齒狀的邊緣。
五. 參考內容: